2010-08-06 29 views
3

對Sun GC有疑問。 Sun常見問題(舊版1.4.2)說吞吐量收集器不使用MaxTenuringThreshold(MTT)參數。它僅用於CMS。 http://java.sun.com/docs/hotspot/gc1.4.2/faq.htmlSun GC maxtenuringthreshold

(12)如果我的應用程序有中長壽命對象,該怎麼辦?

  • 在年輕一代收藏中存活的對象具有複製成本(年輕一代收藏的一部分算法是複製任何能夠存活的對象)。中長壽命對象可能會被複制多次。使用-XX選項MaxTenuringThreshold確定複製成本。使用-XX:MaxTenuringThreshold = 0可以將年輕一代收藏中存活的對象立即移至終身代。如果這樣可以提高應用程序的性能,那麼複製長壽命對象就意義重大。 請注意吞吐量收集器不使用MaxTenuringThreshold參數

我不知道如何來驗證這一點,但如果它的真實,如何吞吐量收集確定何時促進新對象到年老代?每當年輕一代填滿(換句話說,MTT = 0?)它是否完成?

回答

0

如果你正在談論一個現代(1.6.0)的Sun GC,你可以下載源代碼併爲你自己制定完全是發生了什麼事情。但是,當然,這種行爲可能會隨着不同的補丁級別而改變。

這裏有一些參考-XXmaxTenuringThreshold選擇更近的文件:

及各種提示顯示在谷歌搜索。但我無法在網上找到任何明確的文件或對您的問題的明確答案。

+0

感謝斯蒂芬。不幸的是,我不是一個開發人員,所以源代碼不會真的幫助我很多:(我會繼續挖掘,如果我找到了一些東西,將回到狀態。 – bubbly 2010-08-07 19:41:16

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),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