太阳GC最大终身阈值

3

关于Sun GC的问题。 Sun FAQ(1.4.2旧版)指出,吞吐量收集器不使用MaxTenuringThreshold(MTT)参数。它仅用于CMS。

http://java.sun.com/docs/hotspot/gc1.4.2/faq.html

(12) 如果我的应用程序有中长期或长期存活的对象该怎么办?

  • 在年轻代收集后幸存的对象具有复制成本(年轻代收集的算法的一部分是将任何幸存的对象复制)。中长期或长期存活的对象可能会被复制多次。使用-XX选项MaxTenuringThreshold来确定复制成本。使用-XX:MaxTenuringThreshold = 0立即将幸存于年轻代收集的对象移动到老年代。如果这提高了应用程序的性能,则长期存活对象的复制成本是显著的。请注意,吞吐量收集器不使用MaxTenuringThreshold参数

我不知道如何验证这个问题,但如果是真的,那么吞吐量收集器是如何确定何时将年轻对象提升到老年代的?是否每次年轻代填满时都会执行(换句话说,MTT = 0?)。

2个回答

0

如果你提到现代(1.6.0)Sun GC,则可以下载源代码并自己找出确切的情况。但当然,不同的补丁级别可能会改变其行为。

以下是一些最近的文档,涉及-XXmaxTenuringThreshold选项:

在谷歌搜索中也有一些提示,但我无法在网上找到任何权威的文件或对您的问题的明确答案。


谢谢Stephen。不幸的是我不是开发者,所以源代码对我帮助不大 :( 我会继续查找,如果我找到了什么,会回复状态的。 - souser

0

检查 OpenJDK 1.6 源代码中的 psScavenge.cpp(= -XX:+UseParallelGC = 吞吐量收集器),我们发现

if (AlwaysTenure) {
    _tenuring_threshold = 0;
} else if (NeverTenure) {
    _tenuring_threshold = markOopDesc::max_age + 1;
} else {
    // We want to smooth out our startup times for the AdaptiveSizePolicy
    _tenuring_threshold = (UseAdaptiveSizePolicy) ? InitialTenuringThreshold :
                                                MaxTenuringThreshold;
}

在这种情况下(OpenJDK 1.6),只有当激活了-XX:+UseAdaptiveSizePolicy时,才不使用MaxTenuringThreshold。然后,将使用默认初始值为7
在我看来,粗体字句子的意思是JDK 1.4.2将使用默认/计算的最大值来确定何时提升年轻对象。
如果您想检查这些值,可以使用-XX:+PrintTenuringDistribution
 Desired survivor size 48286924 bytes, new threshold 10 (max 10)
 - age   1:   28992024 bytes,   28992024 total
 - age   2:    1366864 bytes,   30358888 total
 - age   3:    1425912 bytes,   31784800 total

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