GC与其他两种内存管理方法的比较

时间:2014-03-30 02:43:42

标签: java c++ c memory-management garbage-collection

我只是想了解更多关于当前流行的垃圾收集 malloc / free 计数器的信息。

根据我的理解, GC 是最受欢迎的,因为它减轻了开发人员手动管理内存的负担,而且更具弹性。 malloc / free 容易出错并导致内存泄漏。

来自http://ocaml.org/learn/tutorials/garbage_collection.html

  

为什么垃圾收集比显式内存分配更快   如在C?人们常常认为免费收取费用。事实上   免费是一项昂贵的操作,涉及导航   内存分配器使用的复杂数据结构。如果你的程序   间歇性地调用,然后需要所有代码和数据   加载到缓存中,替换每个程序代码和数据   你释放单个内存分配的时间。一种收集策略   一次释放多个内存区域(例如池分配器)   或者GC)只为多次分配支付这一罚款一次(因此   每次分配的成本大大降低了。)

GC 是否比 malloc / free 更快?

此外,如果计数器样式的内存管理( objective-c 正在使用它)加入聚会怎么办?

我希望有人可以通过更深入的见解来总结比较。

2 个答案:

答案 0 :(得分:2)

  

GC是否比malloc / free更快?

可以。这取决于内存使用模式。这还取决于你如何测量"更快"。 (例如,您是在测量整体内存管理效率,单独调用malloc / free,还是......暂停时间。)

但相反,malloc / free通常比现代复制GC更好地利用内存...前提是您不会遇到堆碎片问题。并且malloc / free"工作"当编程语言没有提供足够的信息以允许GC将堆指针与其他值区分开来时。

  

另外,如果计数器式内存管理(objective-c正在使用它)加入派对怎么办?

引用计数的开销使指针赋值更加昂贵,并且您必须以某种方式处理引用循环。

另一方面,引用计数确实提供了一种控制内存管理暂停的方法......这可能是交互式游戏/应用程序的一个重要问题。内存使用率也更好;见上文。


FWIW,您引用的来源中提出的观点是正确的。但这不是全局。

问题是整个图片太复杂了,无法在StackOverflow答案中正确覆盖。

答案 1 :(得分:0)

在Java的情况下,当对象足够小以适应线程本地分配缓冲区时,不存在对任何锁的竞争。

TLAB

这是一个内部设计,它已被证明非常好用。根据我的理解,分配一个新的Object只是一个指针凹凸

TLAB Bump The Pointer

非常快。