チューニングのベースになるGCオプションの備忘録。
JDK6以上が対象で、デフォルトで設定されているものも明示的に指定。
動作設定
-server
-d64
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
-XX:+CMSParallelRemarkEnabled
-XX:+CMSClassUnloadingEnabled
-XX:CMSInitiatingOccupancyFraction=70
-XX:+DisableExplicitGC
-XX:+UseCompressedOops
-XX:+OptimizeStringConcat
-XX:-UseGCOverheadLimit
- 64bitのサーバモードで起動。
- コンカレントGCを使用。
- サーバモードなのでCMSIncrementalModeは指定しない方がいい。
- G1GCでもいいが、世代別GCの方が有効な場合が多い。
- メジャーGC、マイナーGCをマルチスレッド化。
- クラスアンロードを有効。
- 6u4からはCMSPermGenSweepingEnabledの指定は不要。
- GC発生の閾値を70%に設定。
- 60〜70%が望ましい。
- 明示的なFullGCの使用を制御。
- 自分が使わなくてもライブラリで使われている可能性があるため。
- 64bitのパフォーマンス向上。
- ヒープが32G以下の場合有効。
- むしろ32G以上はオプション指定しなくてもオーバーヘッドがある。
- 文字列結合の最適化。
- 7ではデフォルトON。
- SIGSEGVが発生するバグがあったが修正された。
- 時間が掛かってもGCを必ず実行する。
- この設定はケースバイケース。
ログ設定
-XX:+PrintClassHistogram
-XX:+HeapDumpOnOutOfMemoryError
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=10
-XX:GCLogFileSize=5M
-Xloggc:${GCLOG}
- ヒープの統計情報を出力。
- OutOfMemoryError発生時にヒープダンプを出力。
- GCの時間を日付とタイムスタンプで出力。
- 日付も出力すると見やすい。
- New領域とOld領域のオブジェクト量の変化情報を出力。
- GCログを5Mずつ10世代でローテーション。
- ローテーションは6u34から使用可能。
メモリ設定
-XX:MaxPermSize=384m
-XX:PermSize=384m
-XX:NewRatio=2
-XX:SurvivorRatio=8
-XX:MaxTenuringThreshold=31
-XX:TargetSurvivorRatio=90
-Xmn${MIN}
-Xmx${MAX}
-Xms${MAX}
- Permanent領域を384mに設定。
- 256〜384mあれば十分。
- Permanent領域の大きさが変わる時にFullGCが走るためPermSizeとMaxPermSizeは必ず同じ値にする。
- New領域とOld領域の比率を1:2に設定。
- NewSizeとMaxNewSizeはXmnと同じ値に設定される。
- コンカレントGCの場合New領域よりもOld領域を20%以上大きくすることが望ましい。
- Eden領域とFrom領域、To領域の比率を8:1:1に設定。
- Eden領域に長くいてもらうため多めに確保。
- GCを31回行っても残っているオブジェクトをOld領域に移動。
- Old領域にはなるべく行かせないため。
- Survivor領域からOld領域に移動する閾値を90%に設定。
- これもOld領域にはなるべく行かせないため。
- ヒープサイズはサーバのメモリ量とアプリが必要なメモリ量で適宜設定。
- ヒープサイズが大きいほどGC発生頻度は下がるが一度に処理する量が増える。
- FullGCが発生したらLiveDataSizeの3〜4倍を目安にMAXを設定する。