什么是Java中的“单代”垃圾收集器?

5

在阅读有关ZGC的信息时,我注意到它吹嘘自己是“单代垃圾收集器”,但很少看到关于这个术语的详细说明。

常规分代GC

我熟悉Eden、survivor空间、nursery、hospice care、metaspace、permgen、僵尸对象、诺亚方舟和老年人之家,因此我不需要解释并发标记扫描(CMS GC)或垃圾优先(G1 GC)算法的工作原理。我的理解是它们都是多代的,我对此很满意。

就我个人而言,我总是喜欢通过Java Mission Control查看一个对象经过了多少代GC周期。这在故障排除内存泄漏或GC问题时总是非常有用。

单代与多代GC

那么什么是“单代”垃圾收集器,它与CMS和G1中当前跟踪对象在多次垃圾收集周期中的方式有什么不同呢?


1
... [ZGC] 是一种单代收集器,目前还没有年轻代或老年代... - Turing85
2个回答

5

简而言之

ZGC有许多值得夸耀的地方,但单代垃圾收集器不是其中之一。

未来改进计划包括添加多代特性。

细节

一些垃圾收集器实现区分新对象和旧对象,“年轻代”与“老年代”。目标是使程序员更容易创建短寿命周期的对象,因为这些对象将更快、更有效地被处理以释放内存。

ZGC并没有“炫耀”其单代特性。相反,该团队已表明他们希望在未来版本的ZGC中添加多代特性。请参见Oracle的Per Liden在此演讲中关于此主题的讨论(等待几秒钟即可看到新幻灯片“Generational ZGC”):https://youtu.be/88E86quLmQA

有关代的更多信息,请参见此问题:Java堆术语:年轻代、老年代和永久代?


我只是想用“brag”这个词来丰富我的语言表达。 - Cameron McKenzie
@CameronMcKenzie 已经明白了。ZGC 有很多值得吹嘘的地方,但单代并不是其中之一。 - Basil Bourque

3
你知道细节,但你知道为什么要发明分代垃圾收集器吗?具体来说,为什么G1GC是分代的?
当时的想法是扫描整个堆是昂贵的,昂贵的意味着STW。实际上,G1最初是非分代的(或者像您所称的单代),但是记忆集的大小以及它们浏览它们的时间触发了它成为分代的。有“代”的事实加上G1在单个周期内扫描所有年轻区域的事实(或更好地说,如果它“承诺”在某个周期的开始时扫描一些X个年轻区域 - 它必须扫描所有这些区域),这意味着您不需要在年轻空间中的记忆集之间建立连接(卡表也小得多)。
至于你的直接问题,ZGC(以及 Shenandoah )不会“跟踪”对象存活了多少个周期,他们不需要这样做,因为他们没有代,所以不需要将对象移动到“旧”中以便稍后进行扫描。他们在每个周期都会扫描整个堆。他们以并发的方式执行此操作(以非常有趣的方式),因此目前没有必要将它们变成分代。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接