了解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相關的重要參數:
- 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
- Perm Gen size相關的JVM options (可以解決java.lang.OutOfMemoryError:Perm Gen Space)
- -XX:PermSize=256m 設定預設Perm space(建議和最大值相同)
- -XX:MaxPermSize=256m 設定最大Perm space
- 列印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檔案放至指定目錄 (必要)
- 指定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:
Post a Comment