我已经阅读了一些关于垃圾收集如何运作的文章,但仍然不了解如何使用世代帮助?据我所知,主要的想法是我们从最年轻的一代开始收集并转向老一代。但是为什么这个想法的作者决定从最年轻的一代开始是最有效的方式呢?
答案 0 :(得分:3)
年代越大,意味着对象已被使用了很多次,并且可能需要再次使用。 删除最近创建的对象毫无意义,可能是它的临时(范围:本地)对象。
答案 1 :(得分:2)
作者首先从最年轻的一代开始,因为这是在应用程序启动后首先填满的东西,但实际上哪一代正在被扫描,何时在应用程序运行时是非确定性的。
代际GC的重点是:
年轻一代使用一个复制收集器,它将对象复制到它认为是空的空间(未使用的幸存者空间)来自伊甸园和当前的幸存者空间,因此速度快且GC暂停很小。
添加到这个事实,大多数对象都很年轻,因此从eden和当前幸存空间复制少量幸存对象所需的暂停很小,因为只有对象的对象复制引用,之后可以擦除伊甸园和以前的幸存者空间。
被复制多次后,对象被复制到终身(旧)代;最终终生代将填满,但是,这次没有一个干净的空间来复制对象,所以垃圾收集器必须在一代内进行扫描和压缩,这很慢(与在伊甸园中执行的复制相比)幸存者空间)意味着更长的停顿。
这个好消息,基于年轻启发式的大多数对象,主要的GC发生的频率远低于在应用程序生命周期内将GC暂停降至最低的次数。
还有一个好处是所有新对象都分配在堆的顶部,这意味着需要这样做的最小指令,并且碎片整理在复制过程中自然发生。
这两个页面Oracle Garbage Collection Tuning和Useful JVM Flags – Part 5 (Young Generation Garbage Collection)都描述了这一点。
答案 2 :(得分:0)