Java G1(垃圾优先)垃圾收集器上的对象如何老化?

Java G1(垃圾优先)垃圾收集器上的对象如何老化?,java,garbage-collection,Java,Garbage Collection,将年轻对象放入旧区域使其成为旧对象或将其保留在幸存者区域的标准是什么 本州青年GC的第4点: “活动对象被疏散(即复制或移动)到一个或多个位置 幸存者区域。如果满足老化阈值,则某些对象 推广到老一代地区。” 但我找不到这个标准是什么 编辑: Amit Bhati将我指向MaxTenuringThreshold参数。官方文件对此我了解不多,但我想我开始了解它是如何工作的。来自: 堆空间分为新一代和旧一代。新的 生成包括新对象空间(eden)和两个幸存者 空间。JVM在eden空间中分配新对象并移动

将年轻对象放入旧区域使其成为旧对象或将其保留在幸存者区域的标准是什么

本州青年GC的第4点:

“活动对象被疏散(即复制或移动)到一个或多个位置 幸存者区域。如果满足老化阈值,则某些对象 推广到老一代地区。”

但我找不到这个标准是什么

编辑:

Amit Bhati将我指向MaxTenuringThreshold参数。官方文件对此我了解不多,但我想我开始了解它是如何工作的。

来自:

堆空间分为新一代和旧一代。新的 生成包括新对象空间(eden)和两个幸存者 空间。JVM在eden空间中分配新对象并移动 从新一代到旧一代的寿命更长的对象

年轻一代使用快速复制垃圾收集器 在伊甸园中使用两个半空间(幸存者空间),复制 从一个幸存者空间到第二个幸存者空间的幸存对象。反对 生存多个年轻的空间收藏是终身的,这意味着他们是 已复制到终身一代。终身一代更大且 填充得不那么快。因此,垃圾收集的频率较低; 而且每个集合所需的时间都比仅限年轻空间的集合要长。 收集长期使用的空间也被称为做一个完整的测试 代收

频繁的年轻空间收集很快(几毫秒), 而完整一代的收集需要更长的时间(几十年) 毫秒到几秒钟,具体取决于堆大小)

其他GC算法,如并发标记扫描(CMS) 算法,都是增量的。他们将整个GC分为几个部分 增量块。这提供了小暂停的高概率。 这个过程会带来开销,企业不需要它 网络应用程序

另请查看本文:

年轻一代由一个伊甸园和两个幸存者空间组成。 伊甸园中的活动对象被复制到最初为空的幸存者 空间,图中标记为S1,但太大而无法使用的空间除外 舒适贴合S1空间。这些对象直接复制到 老一代。被占领幸存者空间中的活动对象 (标记为S0)仍然相对年轻的也会复制到 其他幸存者空间,同时复制相对较旧的对象 给老一代。如果S1空间已满,则活动对象 来自伊甸园或S0,但未复制到其中的为终身制, 不管他们的年龄。伊甸园或S0空间中剩余的任何对象 复制活动对象后,这些对象不是活动对象,也不必是活动对象 检查。下图说明了年轻一代之后的堆 收藏:

年轻一代系列引领世界停止停顿。之后 集合、伊甸园和一个幸存者空间为空。现在让我们看看怎么做 CMS处理旧一代收集。它基本上由两部分组成 主要步骤–标记所有活动对象并扫描它们


在你的帮助下,我想我找到了答案:

-XX:InitialTenuringThreshold=7设置初始有效期阈值,用于并行年轻收集器中的自适应GC大小调整。这个 tenuring threshold是一个对象在一个年轻对象中存活的次数 在晋升到老一代或终身一代之前收集。 -XX:MaxTenuringThreshold=n设置用于自适应GC大小调整的最大使用期限阈值。当前最大值为15。默认值 并行收集器的值为15,CMS的值为4

它位于调试选项下(标题:)

垃圾优先(G1)垃圾收集选项下可以找到:

-XX:MaxTenuringThreshold=n有效期阈值的最大值。默认值为15


如果您没有阅读其他部分的InitialtenUringReshold说明,则说明性不强。InitialtenUringReshold似乎不是一个有效的G1选项,但我认为算法就是这里所描述的。

下面的文档很好地解释了如何改变(降低)项目在G1收集器中从幸存者空间升级到旧世代的速率

(题为“调整年轻一代”的部分)


正如上面的答案所说,
MaxTenuringThreshold
是关键设置,但这只是一个上限,如果您的年轻人没有足够大的空间来满足这一要求,则会被忽略。在这种情况下,您需要通过
NewRatio
增加整个YoungGen,或者通过
SurvivorRatio

增加生存空间。粗体文本不是很具体,我不确定G1 GC是否使用与其他GCs相同的标准。我认为你的大部分答案也只适用于较旧的GC。你是在解释其他GC,而不是垃圾优先收集器。问题是关于G1的工作。这个分析看起来很棒。非常感谢。