G1(Garbage First)垃圾收集器中对象如何老化?

3
什么是将年轻对象放入旧区域使其成为旧对象或将其保留在幸存者区域的标准?
Young GC 的第4点在官方教程中说明:
“活动对象被疏散(即复制或移动)到一个或多个幸存者区域。如果达到老年阈值,则会将一些对象提升到老年代区域。”
但我找不到这个标准是什么。
编辑:
Amit Bhati指向了MaxTenuringThreshold参数。我从官方文档中没有理解太多,但我认为我开始理解它的工作原理了。
3个回答

2
通过您的帮助,我认为我已经在这里找到了答案:
-XX:InitialTenuringThreshold = 7 用于自适应 GC 大小调整中的并行 young 收集器的初始 tenuring 阈值。tenuring 阈值是对象在 young collection 中存活的次数,在晋升到 old 或 tenured 代之前。 -XX:MaxTenuringThreshold = n 用于自适应 GC 大小调整的最大 tenuring 阈值。当前最大值为 15。对于并行收集器,默认值为 15,对于 CMS,默认值为4。
它在“Debugging Options”标题下 :)
在“Garbage First (G1) Garbage Collection Options”下,您可以找到以下内容:
-XX:MaxTenuringThreshold = n tenuring 阈值的最大值。默认值为 15。
如果您没有阅读其他部分中的 InitialTenuringThreshold 描述,则此描述不太具体。似乎 InitialTenuringThreshold 不是有效的 G1 选项,但我认为算法在那里有描述。

1
以下文档很好地解释了如何减少在G1收集器中从幸存者空间晋升到老年代的速率。
请参考http://java-is-the-new-c.blogspot.co.uk/2013/07/tuning-and-benchmarking-java-7s-garbage.html(标题为Tuning The Young Generation的部分)。
正如上面的答案所说,MaxTenuringThreshold是关键设置,但这只是一个上限,如果您的YoungGen不足以允许这个上限得到遵守,则会被忽略。在这种情况下,您需要通过NewRatio来增加整个YoungGen或仅通过SurvivorRatio来增加SurvivorSpace。

那个分析看起来很棒。谢谢。 - aalku

0

来自Javadocs

堆空间分为老年代和新生代。新生代包括新对象空间(eden)和两个幸存者空间。JVM在eden空间中分配新对象,并将寿命较长的对象从新生代移至老年代。 年轻代使用快速复制垃圾收集器,它在eden中使用两个半空间(幸存区),将幸存对象从一个幸存区复制到第二个幸存区。在多次年轻代空间收集中幸存的对象会被提升到老年代,即被复制到老年代。老年代更大,填充得更慢。因此,它的垃圾收集频率比年轻代低;每次收集所需的时间也比只收集年轻代时长。收集老年代称为执行完整垃圾回收。
频繁的年轻代空间收集速度很快(几毫秒),而进行完整垃圾回收需要更长时间(数十毫秒到几秒,具体取决于堆大小)。
其他GC算法,如并发标记扫描(CMS)算法,则是增量式的。它会将完整的GC分成几个增量部分。这提供了小暂停的高概率。这个过程带有一些额外的开销,对企业级Web应用程序来说并不是必需的。

还要查看这篇文章:Java垃圾收集器-转向Java7垃圾优先(G1)收集器

enter image description here

年轻一代包括一个伊甸园和两个幸存者空间。 伊甸园中的活动对象被复制到最初为空的幸存者空间(标记为S1),除了那些太大而无法舒适地适应S1空间的对象。这些对象直接复制到老一代。占用的幸存者空间(标记为S0)中仍然相对年轻的活动对象也被复制到另一个幸存者空间,而相对较老的对象则被复制到老一代。如果S1空间变满,来自伊甸园或S0的未被复制到其中的活动对象将被终身使用,无论它们的年龄如何。在复制活动对象之后,留在伊甸园或S0空间中的任何对象都不是活动对象,因此不需要检查。下图说明了年轻一代收集后的堆:

enter image description here

年轻一代的收集导致了世界的暂停。在收集之后,伊甸园和一个幸存者空间都是空的。现在让我们看看CMS如何处理老一代的收集。它基本上包括两个主要步骤-标记所有活动对象并清除它们。

1
那个粗体文本不是很具体,我不确定G1 GC使用与其他GC相同的标准。我认为你的大部分回答只适用于旧的GC。 - aalku
你正在解释其他GC,而不是垃圾优先收集器。问题是关于G1的工作原理。 - Juvenik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接