Java GC停止并复制

时间:2010-09-20 16:43:15

标签: java garbage-collection

这个问题是我以前的Java GC问题的后续问题:Java Garbage Collector clarification

这个问题也指的是同一篇文章。

我对为什么对象堆分配进行碎片整理的stop and copy方法如此常用感到困惑。是的,它会对堆进行碎片整理,但似乎有很多开销,因为基本上你将堆大小的总量减少了一半。此外,当一半空间用完时,您需要复制所有活动对象。

除了碎片整理之外,“停止和复制”比“标记和扫描”更好还有其他根本原因吗?

2 个答案:

答案 0 :(得分:4)

实际上,碎片的基础,而某些GC打败它的能力是相当大的资产。

停止复制算法以前在GC实施中非常流行,因为:

  1. 实施起来很简单;
  2. 它会自动对内存进行碎片整理;
  3. 它的运行时间与 live 对象的数量成正比,这使得它渐近非常有效。
  4. 更现代的GC,包括在Java中使用的那些,使用更复杂的策略,因为他们想要短暂停顿(而不是让总GC时间低,他们宁愿永远不要停止应用程序很长一段时间,因为暂停对交互性有害),与缓存和虚拟内存进行更干净的交互,并从具有多个CPU的系统中受益。

    对于想要了解垃圾收集的人来说,Jones and Lins book是必读的。

答案 1 :(得分:1)

关于垃圾收集器的一个很棒的教程是Tuning Garbage Collection(不幸的是,新的oracle网站已经将其格式化了很多)。

您的问题在第五章中处理。这基本上解释了您可以在Java垃圾收集器中使用哪些类型的策略以及哪些策略是默认的。大多数桌面应用程序都会对尽可能小的停止感兴趣,因为这是用户可能会注意到的。

请注意,您的问题与碎片整理无关。两者最终都会压缩内存空间。