2013-11-22 34 views
3

我正在研究Java應用程序中的性能問題。我們已經縮小到定期非常昂貴的垃圾收集。該應用程序做非常頻繁的YoungGen垃圾收集(稍微多於每分鐘一次),但通常小於0.5秒。然而,在某些情況下,我們會遇到一兩個小時,其中收集時間高於20秒,在某些情況下高達160秒。分析gc日誌,除了時間長的情況之外,在這些情況下似乎有所不同的是在內核模式(系統時間的大值)中花費的時間的很大一部分。垃圾收集的哪些部分需要系統時間?

什麼原因導致在內核模式下花費時間?服務器運行Java 1.6.0_45,其中-Xms5704m -Xmx5704m-XX:+UseParallelOldGC

+0

你的問題是關於什麼時候*一般*花費在內核模式?另外,您使用的是哪種JRE? – Chandranshu

+0

@Chandranshu:是的,GC期間系統時間很長的原因。我們正在運行Oracle JRE。 – carlpett

回答

1

有了這麼大的堆,預計會有很長的Full GC。您可能會嘗試使用併發標記和掃描,因爲您的分配率似乎不太高(一分鐘不多)。

看到 http://java-is-the-new-c.blogspot.de/2013/07/what-drives-full-gc-duration-its.html

和關於ConcMarkAndSweepGC: http://java-is-the-new-c.blogspot.de/2013/07/tuning-and-benchmarking-java-7s-garbage.html

對於這個問題,有什麼需要SYS時間。在GC期間,可能會與內核和內核內存系統進行交互。

如果系統時間非常高,確保沒有交換磁盤正在進行!由於GC需要週期性地迭代所有分配的對象,因此物理內存不足會導致java不能正常工作,因此如果內存區域被交換到磁盤,GC暫停可能會進入分鐘。最好的是關閉交換。

0

這取決於你的舊有什麼。並行GC不會是一個5GB堆的好候選者。如果你使用visualGC,你可能會擁有約1.5GB的年輕空間,約500mbsw的倖存者和約3.2GB的舊空間。

它需要時間來清除3.2 GB的內存。取決於您在應用中使用的長壽命對象的類型,這個時間可能會很長。使用可同時標記和清除的CMS收集器。這將有助於你的應用程序。如果可能的話,使用這些設置與CMS colelctor -XX:-UseAdaptiveSizePolicy -XX:+ UseTLAB -XX:ConcGCThreads = 12

這些shoudl給你一個很好的提升你的應用程序,雖然GC時代並不意味着現在作爲停止世界清理會少一些。