2013-04-01 38 views
5

我有一個Java應用程序,使用盡可能多的CPU,因爲它有很多內存(高達80Gb)。在java中給GC更多CPU時間?

我正在優化該應用程序的GC,我想告訴JVM使用給定的GC時間百分比(60%),否則機器不在GC中的時間量正在處理和分配更多記憶。

我想確認-XX:CMSIncrementalDutyCycle=60參數是我在找,如果有任何其他的參數給更多的權力GC(我已經看到了CMSIncrementalPacingCMSIncrementalDutyCycleMin

感謝的事一堆!

+1

「我想確認XX:CMSIncrementalDutyCycle = 60參數是我正在查找的thig」 - 試用它,啓用GC日誌記錄並查看?另外,出於好奇:你在做什麼創造了足夠的垃圾在GC上花了60%的時間,而不是很多? – millimoose

回答

1

無法設置 a 天花板在GC收集過程中的CPU使用情況。

CMSIncrementalDutyCycle用於設置(見 [1])未成年人集合之間的時間,這樣你就可以控制GC運行的頻率,從而間接CPU使用率。但是,沒有參數可以讓您直接控制CPU使用率。

+1

並不是一個好主意。事實上,CMSIncrementalDutyCycle只給出它的間接控制權。唉,我的問題是通過大幅度減少年輕一代來解決的。非常感謝。 – mors

1

我想確認XX:CMSIncrementalDutyCycle = 60參數 是我要找的THIG,如果有任何其他參數 下放更多權力給了GC(我已經看到了CMSIncrementalPacing 和CMSIncrementalDutyCycleMin)

不,你錯了。該標誌不會控制可用CPU的百分比分配給JVM的GC。該文件指出:

-XX:CMSIncrementalDutyCycle=<N> default: 50 

這是時間之間的細微藏品是 併發收集器允許運行的百分比(0-100)。如果CMSIncrementalPacing啓用了 ,那麼這只是初始值。

因此,假設您使用的是CMS收集器(-XX:+UseConcMarkSweepGC),那麼上面的標誌控制允許在次要GC收集之間執行CMS的時間百分比。

沒有標誌允許您直接控制GC線程執行的時間量。

+0

好的。那麼,除了GC運行之外的小集合之間會發生什麼呢? – mors

+0

您的應用程序執行,jit編譯方法等 –

+0

您還應該假設啓用了-XX:+ CMSIncrementalMode,這對於「大」框 –

1

首先,CMSIncreamentalDutyCycle會影響增量CMS algoright(應由-XX:+CMSIncrementalMode啓用)。增量模式對您的任務不利。

其次,可以限制GC任務消耗的CPU內核數量。

  • -XX:ParallelGCThreads=N設置核心的數量停止這世界相
  • -XX:ConcGCThreads=N套核心的並行任務(僅適用於CMS)的數量

你可以找到更多的垃圾回收相關的選項here