【问题标题】:What is a 'single-generation' garbage collector in Java?什么是 Java 中的“单代”垃圾收集器?
【发布时间】:2020-12-24 15:05:06
【问题描述】:

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

正常的分代GC

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

就个人而言,我一直很喜欢能够通过 Java Mission Control 来查看一个对象经历了多少代 GC 周期。这对于解决内存泄漏或 GC 问题总是很有帮助。

单代与多代 GC

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

【问题讨论】:

标签: java garbage-collection jvm jvm-hotspot


【解决方案1】:

tl;博士

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

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

详情

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

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

有关世代的更多信息,请参阅此问题:Java heap terminology: young, old and permanent generations?

【讨论】:

  • 我只是想在我的演讲中用“吹牛”这个词来表现得丰富多彩。
  • @CameronMcKenzie 明白了。 ZGC 有很多值得吹嘘的地方,但单代并不是其中之一。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-16
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 2015-03-22
    • 1970-01-01
    • 2010-11-10
    相关资源
    最近更新 更多