1

我在CentOS 64位Linux機器上使用jdk 1.7.0_09。爲什麼JVM在老一代只有一半滿的時候連續地完成gc?

相關VM ARGS由GC是

-Xmx4g -Xmn2g -XX:SurvivorRatio = 4 -XX:PermSize =128米-XX:MaxPermSize參數=128米-XX:InitialTenuringThreshold = 15 -XX:CMSWaitDuration = 50 -XX:MaxTenuringThreshold = 15 -XX:+ UseConcMarkSweepGC -XX:+ UseParNewGC -XX:CMSInitiatingOccupancyFraction = 80 -XX:+ CMSParallelRemarkEnabled -XX:ReservedCodeCacheSize =128米

但它一直在做完整的GC

jstat -gcutil pid 1000  
    S0  S1  E  O  P  YGC  YGCT FGC FGCT  GCT 
    0.00 0.00 15.62 57.52 19.90  11 2.081 11109 7454.686 7456.767 
    0.00 0.00 15.81 57.52 19.90  11 2.081 11109 7454.686 7456.767 
    0.00 0.00 15.81 57.51 19.90  11 2.081 11111 7454.892 7456.973 
    0.00 0.00 16.06 57.51 19.90  11 2.081 11111 7455.115 7457.196 
    0.00 0.00 16.06 57.51 19.90  11 2.081 11111 7455.115 7457.196 
    0.00 0.00 16.27 57.51 19.90  11 2.081 11111 7455.115 7457.196 
    0.00 0.00 16.27 57.51 19.90  11 2.081 11111 7455.115 7457.196 
    0.00 0.00 16.29 57.51 19.90  11 2.081 11111 7455.115 7457.196 
    0.00 0.00 16.29 57.51 19.90  11 2.081 11111 7455.115 7457.196 
    0.00 0.00 16.29 57.47 19.90  11 2.081 11113 7455.549 7457.629 
    0.00 0.00 16.29 57.47 19.90  11 2.081 11113 7455.549 7457.629 
    0.00 0.00 16.34 57.47 19.90  11 2.081 11113 7455.549 7457.629 
    0.00 0.00 16.34 57.47 19.90  11 2.081 11113 7455.549 7457.629 
    0.00 0.00 16.34 57.47 19.90  11 2.081 11113 7455.549 7457.629 
    0.00 0.00 16.42 57.47 19.90  11 2.081 11114 7455.549 7457.629 
    0.00 0.00 16.42 57.44 19.90  11 2.081 11115 7455.986 7458.067 

回答

2

儘管列「FGC」,它不是一個完整的GC。 CMS在做的是一個併發集合,以查看是否可以從舊集合中清除任何內容(您可以看到它正在執行)。可以告訴這不是一個完整的GC的方式是完整的GC清除伊甸園空間並從一個倖存者空間複製到另一個。

恕我直言你使用的選項越多,你就越有可能遇到一些令人驚訝的結果。我會堅持最少的選擇,並看看如何執行。只有當你知道他們總是會幫助你時纔會添加選項。

嘗試用啓動,

-mx4g -XX:MaxPermSize=128m -XX:+UseConcMarkSweepGC 
+0

我同意。使用的標誌表明這是一個Google搜索配置。 如果你真的想要「-XX:InitialTenuringThreshold = 15 -XX:CMSWaitDuration = 50 -XX:MaxTenuringThreshold = 15」,你應該知道爲什麼。 (然後你會知道它們並不重要) –

+1

更糟的是,這些標誌通常是純粹的最佳努力,默認情況下已啓用,或者不做它們看起來要做的事情。即使是'-ms'和'-mx'(通常稱爲'-Xms'和'-Xmx')也不符合大多數人的想法。 –

+0

@FabianLange我們將我們的應用程序與gc標誌的不同設置進行了基準對比,並最終解決了這個問題。我們知道一些配置只是一個建議。 – Timmy

0

這是正常的。你會做「-verbose:gc」,你可以看到「Full」集合實際上是一個併發的集合(你指定了「-XX:+ UseConcMarkSweepGC」)你也可以看到時間並沒有增加太多。那段時間是併發的,而不是停止世界。

相關問題