2012-06-27 516 views
1

我有一個垃圾收集問題,在我們的系統上,垃圾收集時間一直持續上升直到它達到25秒左右的常量。垃圾收集YGCT和垃圾收集時間不斷上升

S0  S1  E  O  P  YGC  YGCT FGC FGCT  GCT 
    0.00 84.18 76.65 35.47 60.16 441 15.581 16 1.834 17.415 
75.72 0.00 97.32 35.47 60.16 442 15.770 16 1.834 17.604 
    0.00 64.69 35.56 35.86 60.16 443 16.318 16 1.834 18.153 
100.00 0.00 19.91 35.87 60.16 444 16.381 16 1.834 18.215 
    0.00 70.61 40.85 36.82 60.17 445 17.488 16 1.834 19.322 
28.80 0.00 19.61 36.82 60.17 446 17.535 16 1.834 19.369 
34.51 0.00 48.01 36.82 60.18 448 17.561 16 1.834 19.395 
    0.00 10.86 20.48 37.11 60.21 453 17.979 16 1.834 19.813 
    9.04 0.00 47.39 37.12 60.23 454 18.063 16 1.834 19.898 
    0.00 71.26 2.65 37.14 60.23 455 18.173 16 1.834 20.007 
63.64 0.00 90.91 38.04 60.23 456 19.562 16 1.834 21.396 
    0.00 76.45 42.70 38.04 60.23 457 19.592 16 1.834 21.426 

這只是我執行一個小負載測試時的活動快照。

我回顧了一些快照,在這裏我不是專家,事實上找到了一些內存問題。明顯的問題現在已經解決。

該機具有以下設置

JAVA_OPTS="$JAVA_OPTS 
-server 
-Xms704m 
-Xmx704m 
-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=/var/log/tomcat6 
-XX:MaxPermSize=192m 
-XX:+UseConcMarkSweepGC 
-XX:+CMSIncrementalMode 
-XX:+CMSIncrementalPacing 
-XX:+DisableExplicitGC 
" 

我們使用Java 6的Tomcat6,Spring框架,休眠的EHCache緩存和使用Quartz各種計劃任務。該項目link實際上幫助解決了導致MAT報告潛在內存泄漏的一些問題,這已不再是這種情況。

我們在我們的測試框中玩過各種各樣的JVM設置,但在所有情況下,垃圾收集時間一直在增長到令人無法接受的水平,這主要是因爲YGCT不斷增長。最初,我認爲緩存是罪魁禍首,因爲我們做緩存對象圖,而不僅僅使用Hibernate Second Level緩存。但是,在MAT中緩存的內存使用似乎並沒有超過18Mbs的大小。

這是內存泄漏還是我應該只是拋出更多的內存?如果是內存泄漏,我怎樣才能最好地調試在MAT?

+0

WHY -Xms和-Xmx是否相等?理想情況下,它不應該是平等的。 –

回答

1

我的理解是絕對正常的。 YGCT列報告自JVM啓動以來所有YGC操作的總和。當然,FGCT和GCT也是如此。

您是否注意到一段時間後的任何性能表現還是這個純科學性質的問題?

+0

不,我注意到處理過程中出現定期的極端峯值導致超時。這通常持續約30秒。在此之後,一切都再次超快。我認爲這是因爲垃圾處理。 – Marc

0

隨着時間的推移,YGC YGCT FGC FGCT GCT將隨着時間累積而增加。你應該感興趣的是差異。

要麼你的監控速度不夠快,要麼你經常GCing。我會嘗試增加內存量,直到它看起來沒有多大區別。例如我通常從一個8 GB的堆開始,擁有6 GB的eden空間,但您可能更喜歡不同的東西。