繁体   English   中英

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

[英]What is a 'single-generation' garbage collector in Java?

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

正常的分代GC

我熟悉伊甸园、幸存者空间、托儿所、临终关怀、元空间、permgen、僵尸对象、诺亚方舟和养老院,所以我不需要解释并发标记扫描 (CMS GC) 或垃圾优先(G1 GC)算法起作用。 我的理解是这些都是多代的,我对此很满意。

就个人而言,我一直很喜欢能够从 go 到 Java 任务控制,看看 object 经历了多少代 GC 周期。 这总是有助于解决 memory 泄漏或 GC 问题。

单代与多代 GC

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

tl;博士

ZGC有很多值得吹嘘的地方,但单代不在其中。

计划添加多代人作为未来的改进。

细节

一些垃圾收集器实现区分新对象和旧对象,即“年轻一代”和“老一代”。 目标是让程序员更便宜地创建短期对象,因为它们将被更快、更有效地处理以释放 memory。

ZGC并不“吹嘘”自己是单代的。 恰恰相反,该团队表示他们希望在 ZGC 的未来版本中添加分代功能。 请参阅 Oracle 的 Per Liden 演讲的本部分中的讨论(等待几秒钟以查看新幻灯片“Generational ZGC”): https://youtu.be/88E86quLmQA

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

你知道细节,但你知道为什么要发明分代垃圾收集器吗? 具体来说,为什么G1GC是分代的?

当时的想法是扫描整个堆是昂贵的,昂贵意味着 STW。 事实上,G1 的生命始于非世代(或你称之为单世代),但记忆集的大小及其到 go 的时间超过了它们,触发了它成为世代。 存在“世代”的事实 + G1在单个周期中扫描所有年轻区域的事实(或者更好地说,如果它“承诺”在某个周期开始时扫描一些 X 数量的年轻区域 - 它必须扫描它们all),意味着您不需要记住的集合在年轻空间中的它们之间建立联系(卡片表也小得多)。

至于你的直接问题, ZGC (以及Shenandoah )不会“跟踪” Object 存活了多少个周期,他们不需要这样做,因为他们没有世代,所以不需要在“旧”以“稍后”扫描。 他们在每个周期扫描整个堆。 他们同时这样做(以一种非常有趣的方式),所以目前根本没有必要让他们世代相传。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM