2015-06-14 45 views
2

我決定嘗試在我的Eclipse火星RC3爲JavaEE的開發人員安裝G1GC,但我發現一個很奇怪的現象:G1GC奇怪的行爲

GCViewer statistics

正如你可以看到它幾乎已經運行700 FULL GC應用程序的生命週期,而只有30個小型GC。另外我注意到,小應用程序在應用程序負載下執行時 - 通常在啓動並加載大量內容時,而在空閒時執行完整的GC。 (這11個小時中大部分時間都是空閒的!)我預計,當應用程序什麼都不做時,不需要GC,或者至少它會是一個小GC。我還監測了eclipse的內存消耗 - 在空閒時間內,它從未增加到130-140 MB以上,所以這是完整GC的奇怪之處的另一個原因。

這裏是我的eclipse.ini JVM配置:

-server 
-Xverify:none 
-XX:+AggressiveOpts 
-XX:+UseG1GC 
-XX:MaxGCPauseMillis=100 
-XX:+UseStringDeduplication 
-XX:+UseCompressedOops 
-XX:+UseCompressedClassPointers 
-XX:MaxMetaspaceSize=256m 
-Xloggc:/home/svetlin/software/eclipse/gc.log 
-XX:+PrintGCDetails 
-XX:+PrintGCTimeStamps 
-XX:+PrintGCDateStamps 
-XX:+UseGCLogFileRotation 
-XX:NumberOfGCLogFiles=5 
-XX:GCLogFileSize=20m 
-Xms1g 
-Xmx1g 

這裏是GC日誌:http://pastebin.com/sVBe4w1A

Java版本:OpenJDK的64位服務器VM(25.45-B02)用於Linux的AMD64 JRE (1.8.0_45-internal-b14),建立於2015年5月17日19:21:01通過「buildd」使用gcc 4.9.2

你知道爲什麼G1GC做這些完整的GC時,顯然不需要對於GC來說呢?

回答

2

您從System.gc()電話患如可以在你的日誌中可以看出:

2015-06-14T14:56:23.682+0300: 12790,173: [Full GC (System.gc()) 121M->118M(1024M), 0,4524898 secs] 
    [Eden: 4096,0K(561,0M)->0,0B(561,0M) Survivors: 0,0B->0,0B Heap: 121,7M(1024,0M)->118,2M(1024,0M)], [Metaspace: 135216K->135216K(1177600K)] 
[Times: user=0,71 sys=0,00, real=0,45 secs] 
2015-06-14T14:57:23.682+0300: 12850,174: [Full GC (System.gc()) 121M->118M(1024M), 0,4732930 secs] 
    [Eden: 3072,0K(561,0M)->0,0B(561,0M) Survivors: 0,0B->0,0B Heap: 121,2M(1024,0M)->118,2M(1024,0M)], [Metaspace: 135216K->135216K(1177600K)] 
[Times: user=0,73 sys=0,00, real=0,47 secs] 
2015-06-14T14:58:28.684+0300: 12915,175: [Full GC (System.gc()) 169M->118M(1024M), 0,4912699 secs] 
    [Eden: 52,0M(561,0M)->0,0B(561,0M) Survivors: 0,0B->0,0B Heap: 169,9M(1024,0M)->118,8M(1024,0M)], [Metaspace: 135601K->135601K(1177600K)] 
[Times: user=0,74 sys=0,00, real=0,49 secs] 

System.gc()電話似乎每一分鐘發生一次。你運行任何奇怪的插件,可能會導致此?

否則,週期性的System.gc()調用通常是由於Java RMI運行時調用它們。在較老的Java版本中,我認爲這是每分鐘完成一次,但現在每小時增加一次。無論如何,嘗試設置這些屬性只是爲了確保:

-Dsun.rmi.dgc.server.gcInterval=999999999 
-Dsun.rmi.dgc.client.gcInterval=999999999 

作爲JVM選項。

+0

大聲笑,我應該手動查看日誌而不是使用GCViewer。儘管哪個組件調用了System.gc()以及爲什麼,這很有趣。 –

+1

附加一個調試器並在該方法上設置一個斷點 – the8472

1

所有完整的GC都是由致電System.gc()造成的。您的GC日誌正好顯示了其中的698個。

所以你的Eclipse發行版可能包含一個插件,導致這個數量的System.gc()調用。如果您無法修復這些呼叫,則可以考慮使用VM選項-XX:+DisableExplicitGC來抑制顯式GC。