这个问题是我以前的Java GC问题的后续问题:Java Garbage Collector clarification
这个问题也指的是同一篇文章。
我对为什么对象堆分配进行碎片整理的stop and copy方法如此常用感到困惑。是的,它会对堆进行碎片整理,但似乎有很多开销,因为基本上你将堆大小的总量减少了一半。此外,当一半空间用完时,您需要复制所有活动对象。
除了碎片整理之外,“停止和复制”比“标记和扫描”更好还有其他根本原因吗?
答案 0 :(得分:4)
实际上,碎片是的基础,而某些GC打败它的能力是相当大的资产。
停止复制算法以前在GC实施中非常流行,因为:
更现代的GC,包括在Java中使用的那些,使用更复杂的策略,因为他们想要短暂停顿(而不是让总GC时间低,他们宁愿永远不要停止应用程序很长一段时间,因为暂停对交互性有害),与缓存和虚拟内存进行更干净的交互,并从具有多个CPU的系统中受益。
对于想要了解垃圾收集的人来说,Jones and Lins book是必读的。
答案 1 :(得分:1)
关于垃圾收集器的一个很棒的教程是Tuning Garbage Collection(不幸的是,新的oracle网站已经将其格式化了很多)。
您的问题在第五章中处理。这基本上解释了您可以在Java垃圾收集器中使用哪些类型的策略以及哪些策略是默认的。大多数桌面应用程序都会对尽可能小的停止感兴趣,因为这是用户可能会注意到的。
请注意,您的问题与碎片整理无关。两者最终都会压缩内存空间。