12.02.2014

關於GC的JVM參數

了解GC相關的JVM參數對於在乎即時性的系統相當重要,例如高流量低latency的電子商務系統或線上交易系統,每一秒都相當重要。然而GC tuning需要不斷的trial-and-error以及profiling來找出最適合的設定,並沒有特定參數適合所有系統
在tuning的過程中,profiling可以幫助我們了解application會產生什麼物件,以及這些物件的平均生命週期。舉例來說,若你的系統大多數是生命週期很短的物件,加大Eden space會有效降低minor GC的次數;但也不能無限制的擴大,因為Young generation愈大,代表Tenured generation愈小,可能因此導致Tenured generation很快就滿了,必需頻繁地進行Full GC,降低整體系統的throughput[註1]。

接下來讓我們來看與GC相關的重要參數:


  1. Java heap size相關的JVM options (必要)
    • -Xms1024m  設定初始Java heap size (必要)理想的大小為使用量佔60%,這樣可以確保當忽然湧進大量使用者時,系統仍有一定的成長空間。建議Xms:Xmx比例為1:1或1:1.5,設為相等較為常見,以避免每次GC完後重新分配記憶體大小(CPU time)。
    • -Xmx1024m  設定最大Java heap size (必要)
    • -XX:NewRatio=3  設定Young跟Tenured generation的比例,一般建議設為3~4(譬如總heap為1024m,若設為3,則Young space為256m,Tenured space為768m)
    • -XX:NewSize=512m  設定default Young generation的大小,一般會設的跟max一樣,若你需要比NewRatio更精準的控制大小時才會使用
    • -XX:MaxNewSize=512m  設定max Young generation的大小
    • -Xss     設定Java thread stack size
  2. Perm Gen size相關的JVM options (可以解決java.lang.OutOfMemoryError:Perm Gen Space)
    • -XX:PermSize=256m  設定預設Perm space(建議和最大值相同)
    • -XX:MaxPermSize=256m  設定最大Perm space
  3. 列印GC log相關的JVM option (必要)
    •  -verbose:gc   Log garbage collector執行結果以及花了多少時間 (必要),開啟以利後續GC tuning
    • -XX:+PrintGCDetails   除了包含 -verbose:gc的資訊外,額外提供new generation大小以及GC花費的時間 (必要)
    • -XX:-PrintGCTimeStamps     印出GC執行時的時間點 (必要)
    • -XX:+PrintGCDateStamps    印出GC執行時的日期
    • -XX:+HeapDumpOnOutOfMemoryError   當OOM error發生時,自動產生heap dump (必要)
    • -XX:HeapDumpPath           將產生的heap dump檔案放至指定目錄 (必要)
  4. 指定Garbage collector的參數 
Classification Option Remarks
Serial GC -XX:+UseSerialGC
Parallel GC -XX:+UseParallelGC
-XX:ParallelGCThreads=value
Parallel Compacting GC -XX:+UseParallelOldGC
CMS GC -XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
-XX:+CMSParallelRemarkEnabled
-XX:CMSInitiatingOccupancyFraction=value
-XX:+UseCMSInitiatingOccupancyOnly
‑XX:+CMSConcurrentMTEnabled
G1GC -XX:+UseG1GC available from Java 7 

[註1]Throughput的定義是扣除GC花費的時間,系統可以使用的時間比;也就是[系統可用時間]/[總系統執行時間]。

No comments: