12 Garbage Collection

Ehcacheマニュアルの12章では、ガーベージコレクションについて扱っています。特に巨大なヒープを用いる場合のGCの問題にフォーカスしています。このネタは、JDK1.5を対象としているらしい。

12.1 Detecting Garbage Collection Problems

Full GC 中は、すべてのスレッドが停止します。Full GC の動作時間は、jstat で FGCT の値を見れば把握できます。

書式:jstat -gcutil
例 :jstat -gcutil 10000 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 オプション指定しても回避できません。ということで、以下のシステムプロパティでインターバルを調整します。

  • Dsun.rmi.dgc.client.gcInterval=60000
  • Dsun.rmi.dgc.server.gcInterval=60000

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