2012-12-13 44 views
5

我們的服務器具有128GB的RAM和64個內核,在CentOS 6.3上運行Tomcat 7.0.30和Oracle jdk1.6.0_38。優化Tomcat /垃圾收集

每隔60分鐘我們就會看到垃圾收集耗時45-60秒。添加-XX:-UseConcMarkSweepGC將頁面加載時間增加了大約10%,但將其減少到了大約3秒,這是可接受的權衡。

我們的配置:

-Xms30g 
-Xmx30g 
-XX:PermSize=8g 
-XX:MaxPermSize=8g 
-Xss256k 
-XX:-UseConcMarkSweepGC 

我們設置堆爲30 GB,保持32位尋址(我讀了上面的32 GB的64位尋址佔用更多的內存,所以你必須去到約48 GB看到改進)。

使用visualgc中我可以看到伊甸空間通過每30騎自行車 - 60分鐘,但與倖存者0,倖存者1,老根,和彼爾姆將軍沒有太大的情況

我們有一個強大的服務器。我們還可以通過其他哪些優化來進一步縮短3秒的GC時間?

任何改善性能或縮放比例的建議?

任何其他輸出或配置信息,這將有助於?

+3

'-XX:-UseConcMarkSweepGC'默認情況下不是這樣的,也許你打算用'-XX:+ UseConcMarkSweepGC'打開它。這對任何情況都不會影響伊甸園的大小。 –

+0

找到你創建這麼多對象的地方,看看你可以在哪裏優化它與池和/或緩存 –

+0

如果你看到舊的活動很少,爲什麼你得到完整的GC。我懷疑當你不需要它時會觸發它。 –

回答

1

看來你需要的增量GC減少停頓:

  • -XX:+ UseConcMarkSweepGC -XX:+ CMSIncrementalMode

並沒有visualgc的追查這總是很順利,我(在輸出catalina.out中):

  • -verbose:GC -XX:+ PrintGCDetails -XX:+ PrintGCDateStamps -XX:+ PrintGCTimeStamps

2013-01-05T22:52:13.954 + 0100:15918369.557:[GC 15918369.557:[DefNew: 65793K-> 227K(98304K),0.0031220秒] 235615K-> 170050K(491520K) 0.0033220秒] [時間:用戶= 0.01 SYS = 0.00,實際= 0.00秒]

後,您可以這樣玩:

  • -XX:新尺寸= ABC -XX:MaxNewSize = ABC
  • -XX:SurvivorRatio = ABC
  • -XX:NewRatio = ABC

參考:Virtual Machine Garbage Collection Tuning

4

這聽起來違反直覺的,但你有沒有試過分配少了很多的內存?例如。你真的需要30G堆嗎?如果你能與4G相處甚至更少:垃圾收集可能更頻繁,但是當它發生時,它會快得多。通常情況下,我覺得這比分配大量內存更爲可取,因爲需要花費時間清理它。

即使這不會幫助你,因爲真的需要30G的內存,其他人可能會出現類似的問題,他們可能會受益於分配較少。

+0

特別是,您可以刪除「-Xms」標誌,並讓JVM的大小達到它的喜好。 – pauldoo

+1

@pauldoo如果-Xmx是現實的,我喜歡推薦-Xmx與-Xms相同:如果你從2G開始,但虛擬機決定在凌晨3點的星期​​天晚上想要從操作系統中分配它的全部餘額,但是失敗後,儘管設置了最大值,您仍會收到OOM。至少對於生產系統來說,這是我的默認建議。對於非生產,我會同意你的意見。 –

+1

您爲生產系統描述的行爲還需要添加-XX:+ AlwaysPreTouch,否則OS的惰性分配仍然會在JVM首次嘗試使用堆的特定部分時引起意外。 – pauldoo