2010-09-20 71 views
1

这个问题是一个跟进我以前的Java GC问题:Java Garbage Collector clarificationJava的GC停止复制

这个问题也被提到了同一篇文章。

我有点困惑,为什么stop and copy碎片整理对象堆分配的方法是如此常用。是的,它会对堆进行碎片整理,但是看起来好像有大量的开销,因为基本上你将堆的总大小减半。另外你需要复制所有活着的物体,当一半的空间用完时。

除碎片整理之外,还有其他一些根本原因,为什么'停止和复制'比'标记和扫描'更好?

+3

你确实意识到这篇文章是从1996年开始的,从那以后世界已经发生了很多变化,对吧?看一看Sun Hotspot文档,特别是“调整垃圾回收”,看看今天的情况(我没有链接,但Google有)。 – Anon 2010-09-20 17:00:13

+0

碎片整理并不一定会将堆大小总量减半。有些实现可能会这样做。它也不一定会复制所有活动对象。 – 2010-09-20 17:17:52

+0

好的,所以我只是google'调整垃圾收集',但我真的不明白这个机制?有人可以快速解释吗? – Albinoswordfish 2010-09-20 17:47:43

回答

4

实际上,碎片的根本,而一些GC击败它的能力是一个相当的资产。

曾经是流行的GC实现的停止和拷贝算法因为:

  1. 它是简单的实现;
  2. 它自动整理内存;
  3. 其运行时间与对象的数量成正比,这使得它渐近效率非常高。

更现代的GC,包括那些在Java中使用,使用更加复杂的策略,因为他们想使短暂停(而不是让总GC时间低,他们希望永远不要停止很长一段时间的应用,因为暂停对交互性不利),与缓存和虚拟内存更干净地交互,并受益于具有多个CPU的系统。

Jones and Lins book是谁想要了解垃圾收集的必读。

1

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

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

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