在阅读有关ZGC的文章时,我注意到它吹嘘自己是一个“单代垃圾收集器”,但我很少看到这个术语确切含义的任何细节。
正常世代GC
我熟悉伊甸园、幸存者空间、托儿所、临终关怀、元空间、permgen、僵尸对象、诺亚方舟和敬老院,所以我不需要解释并发标记清理(CMS )或垃圾优先(G1 GC)算法是如何工作的。我的理解是,它们都是多代人的,我对此很满意。
就我个人而言,我总是喜欢能够通过Java Java来查看一个对象经历了多少代GC周期。这对解决内存泄漏或GC问题总是很有帮助的。
单代GC与多代GC
那么,到底什么是“单代”垃圾收集器,这与当前在内容管理系统和G1中如何通过多个垃圾收集周期跟踪对象有什么不同?
发布于 2020-12-25 00:03:42
tl;dr
ZGC有很多值得吹嘘的地方,但单代并不在其中。
增加多代是计划作为未来的改进。
详细信息
一些垃圾收集器实现区分新对象和旧对象,即“年轻一代”与“老一代”。这样做的目的是让程序员创建短期对象的成本更低,因为可以更快、更有效地处理这些对象以释放内存。
ZGC不会“吹嘘”自己是单代的。相反,该团队表示,他们希望在ZGC的未来版本中添加分代功能。请参阅Oracle的Per Liden演讲的这一部分的讨论(请等待几秒钟以获得新的幻灯片“Generational ZGC”):https://youtu.be/88E86quLmQA
有关各代的更多信息,请参阅此问题:
发布于 2020-12-29 01:35:02
您确实知道其中的细节,但是您知道为什么要发明分代垃圾收集器吗?具体地说,为什么G1GC是代际的?
当时的想法是,扫描整个堆的成本很高,这意味着STW。事实上,G1是在一个非世代(或者您所说的单代)的时代开始的,但是记忆集的大小和它们复习它们的时间,触发了它成为世代。有“几代”的事实+ G1在一个周期内扫描所有年轻区域的事实(或者更准确地说,如果它在某个周期开始时“承诺”扫描一些X个年轻区域-它必须扫描所有这些区域),这意味着你不需要记住的集合在年轻空间中具有它们之间的连接(卡片表也要小得多)。
关于你直接的问题,ZGC (以及Shenandoah)不“跟踪”一个对象存活了多少个周期,它们不需要这样做,因为它们没有世代,所以不需要将对象移动到“旧”中的某个地方,以便“稍后”进行扫描。它们在每个周期中扫描整个堆。他们同时做这件事(以一种非常有趣的方式),所以目前根本没有必要让他们代代相传。
https://stackoverflow.com/questions/65440031
复制相似问题