在阅读zgc时,我注意到它吹嘘自己是一个“单代垃圾收集器”,但我很少看到关于这个术语确切含义的任何细节。
正常世代gc
我很熟悉伊甸园、幸存者空间、托儿所、临终关怀、元空间、permgen、僵尸对象、诺亚方舟和老年之家,所以我不需要解释并发标记扫描(cms gc)或垃圾优先(g1 gc)算法是如何工作的。我的理解是这些都是多代人的,我很赞同。
就我个人而言,我一直喜欢能够通过java任务控制来查看一个对象经历了多少代gc循环。这对于排除内存泄漏或gc问题总是很有帮助的。
单代与多代gc
那么,“单代”垃圾收集器到底是什么,它与当前在cms和g1中通过多个垃圾收集周期跟踪对象的方式有何不同?
2条答案
按热度按时间cunj1qz11#
热释光;博士
zgc有很多值得吹嘘的地方,但单身一代并不在其中。
增加多代是未来的改进计划。
详细信息
一些垃圾收集器实现区分新对象和旧对象,“年轻一代”和“老一代”。这样做的目的是让程序员能够更便宜地创建短暂的对象,因为这样可以更快更有效地释放内存。
zgc并不“吹嘘”自己是一代人。恰恰相反,该团队表示他们希望在zgc的未来版本中添加世代特性。请参阅oracle的per liden在演讲的这一部分中的讨论(请稍等几秒钟,看新幻灯片“generational zgc”):https://youtu.be/88e86qulmqa
有关世代的更多信息,请参阅以下问题:java堆术语:年轻世代、老年世代和永久世代?
w8ntj3qf2#
你知道其中的细节,但是你知道为什么一代又一代的垃圾收集器被发明了吗?具体来说,为什么
G1GC
是世代相传的吗?当时的想法是扫描整个堆是昂贵的,而昂贵意味着stw。事实上,g1是以非世代(或者你称之为单一世代)的方式开始它的生命的,但是记忆集的大小和它们经过它们的时间,触发了它的世代性。事实上有“世代”+事实上
G1
扫描单个周期中的所有年轻区域(或者更好地说,如果它“承诺”在某个周期开始时扫描x个年轻区域-它必须扫描所有区域),这意味着您不需要记忆集在年轻空间中在它们之间有连接(同样卡表小得多)。至于你的直接问题,
ZGC
(以及Shenandoah
)不要“跟踪”一个对象存活了多少个周期,它们不需要这样做,因为它们没有后代,所以不需要将对象移动到“旧”的某个地方,以便“以后”扫描。它们在每个循环中扫描整个堆。他们同时做到这一点(以一种非常有趣的方式),所以目前根本没有必要让他们世代相传。