メモリチューニングを久々に。前回は OOM でアプリケーションが落ちる問題に対して調査したのですが、今回はマイナーGCが多発していました。
簡単な処理を大量にさばくアプリケーションなので基本的には Eden からすぐにメモリ解放されるオブジェクトばかりなのですが、処理時間は数十msほど、頻度が数分に一度だったので気になって調整を試みました。当たり前といえば当たり前なのですが、Eden 領域を増やすとマイナーGCにかかる時間が増え、頻度が減ります。Eden 領域を減らすと逆のことが起きました。Eden 領域だけが対象になる GC だとアルゴリズム間で大差ないかもしれません。(環境が Java7 だったので G1GC は試していないです)
余談ですが tomcat は <tomcat>/bin/setenv.sh
に Java のオプションを追加していました。Java の起動オプションを変更したくて、起動スクリプトや conf/
のしたばかり探してしまって少し手間取りました。 bin/
の下のファイルを書き換えるのはいつも抵抗あります。
以下のブログではコンカレントGCを利用しない場合の各種パラメータの意味や設定例が紹介されています。コンカレントGCを利用すると、いくつかの値のデフォルト値が大きく変わってしまいますので注意。
GCViewer の紹介。簡単に使えました。
CMS
各種オプションの紹介。コンカレントGC を利用した時の各値の変化も記載されていて分かりやすいです。
G1GC
G1GC を簡単に解説しつつ、他の GC のアルゴリズムとの比較も紹介されています。