74
80

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GCオプション備忘録

Last updated at Posted at 2013-07-22

チューニングのベースになる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を設定する。
74
80
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
74
80

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?