12 Garbage Collection
Ehcacheマニュアルの12章では、ガーベージコレクションについて扱っています。特に巨大なヒープを用いる場合のGCの問題にフォーカスしています。このネタは、JDK1.5を対象としているらしい。
12.1 Detecting Garbage Collection Problems
Full GC 中は、すべてのスレッドが停止します。Full GC の動作時間は、jstat で FGCT の値を見れば把握できます。
書式:jstat -gcutil
例 :jstat -gcutil10000 1000000
これは、フル・ガーベージコレクション・タイムなので、システムが完全に停止している時間を表してます。数秒ごとにこの数値が上がるようであれば、通常のアプリであれば問題です。
ちなみに、jpsコマンドで vmid の確認が可能です。(Windowsでコレ系のコマンドを使うにはJSE6以上が必要ですが。)
jps http://java.sun.com/javase/6/docs/technotes/tools/share/jps.html
jstat http://java.sun.com/javase/6/docs/technotes/tools/share/jstat.html
12.2 Garbage Collection Tuning
Sunのコア・ガーベージコレクション・チームは、大容量ヒープをキャッシングに使うためには、以下のチューニングを推奨しているとのこと。
java ... -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:NewSize=<1/4 of total heap size> -XX:SurvivorRatio=16
理由は以下
- -XX:+DisableExplicitGC System.gc()が明示的に呼ばれるのを禁止する。
- -XX:+UseConcMarkSweepGC 停止期間の小さなコレクタを使用する。
- -XX:NewSize=全ヒープサイズの1/4
- -XX:SurvivorRatio=16
12.3 Distributed Caching Garbage Collection Tuning
マニュアルの12.3節では、分散キャッシングが Full GC を引き起こすという報告が上がってます。これは、RMIが頻繁にGCを引き起こすためで、-XX:+DisableExplicitGC オプション指定しても回避できません。ということで、以下のシステムプロパティでインターバルを調整します。
JSE6より前は、60秒の設定だったのですが、JSE6ではデフォルトで60分の設定になってますので、特に設定変更の必要はなさそうです。
http://java.sun.com/j2se/1.5.0/docs/guide/rmi/sunrmiproperties.html
http://java.sun.com/javase/6/docs/technotes/guides/rmi/sunrmiproperties.html