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

n53p2ov0  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(469)

在阅读zgc时,我注意到它吹嘘自己是一个“单代垃圾收集器”,但我很少看到关于这个术语确切含义的任何细节。

正常世代gc

我很熟悉伊甸园、幸存者空间、托儿所、临终关怀、元空间、permgen、僵尸对象、诺亚方舟和老年之家,所以我不需要解释并发标记扫描(cms gc)或垃圾优先(g1 gc)算法是如何工作的。我的理解是这些都是多代人的,我很赞同。
就我个人而言,我一直喜欢能够通过java任务控制来查看一个对象经历了多少代gc循环。这对于排除内存泄漏或gc问题总是很有帮助的。

单代与多代gc

那么,“单代”垃圾收集器到底是什么,它与当前在cms和g1中通过多个垃圾收集周期跟踪对象的方式有何不同?

cunj1qz1

cunj1qz11#

热释光;博士

zgc有很多值得吹嘘的地方,但单身一代并不在其中。
增加多代是未来的改进计划。

详细信息

一些垃圾收集器实现区分新对象和旧对象,“年轻一代”和“老一代”。这样做的目的是让程序员能够更便宜地创建短暂的对象,因为这样可以更快更有效地释放内存。
zgc并不“吹嘘”自己是一代人。恰恰相反,该团队表示他们希望在zgc的未来版本中添加世代特性。请参阅oracle的per liden在演讲的这一部分中的讨论(请稍等几秒钟,看新幻灯片“generational zgc”):https://youtu.be/88e86qulmqa
有关世代的更多信息,请参阅以下问题:java堆术语:年轻世代、老年世代和永久世代?

w8ntj3qf

w8ntj3qf2#

你知道其中的细节,但是你知道为什么一代又一代的垃圾收集器被发明了吗?具体来说,为什么 G1GC 是世代相传的吗?
当时的想法是扫描整个堆是昂贵的,而昂贵意味着stw。事实上,g1是以非世代(或者你称之为单一世代)的方式开始它的生命的,但是记忆集的大小和它们经过它们的时间,触发了它的世代性。事实上有“世代”+事实上 G1 扫描单个周期中的所有年轻区域(或者更好地说,如果它“承诺”在某个周期开始时扫描x个年轻区域-它必须扫描所有区域),这意味着您不需要记忆集在年轻空间中在它们之间有连接(同样卡表小得多)。
至于你的直接问题, ZGC (以及 Shenandoah )不要“跟踪”一个对象存活了多少个周期,它们不需要这样做,因为它们没有后代,所以不需要将对象移动到“旧”的某个地方,以便“以后”扫描。它们在每个循环中扫描整个堆。他们同时做到这一点(以一种非常有趣的方式),所以目前根本没有必要让他们世代相传。

相关问题