Sun GC maxtenuringthreshold

时间:2010-08-06 21:04:03

标签: java garbage-collection jvm

对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 :(得分:0)

如果您正在谈论现代(1.6.0)Sun GC,您可以下载源代码并自己完成 正在进行的操作。但是,当然,行为可能会随着不同的补丁级别而改变。

以下是一些引用-XXmaxTenuringThreshold选项的最新文档:

并在Google搜索中显示各种提示。但我无法在网上找到任何明确的文件或明确的答案。

答案 1 :(得分:0)

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

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),MaxTenuringThreshold-XX:+UseAdaptiveSizePolicy被激活时不会仅使用 。然后,改为使用default initial value of 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