对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?)。
答案 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