7.2.7 GCの発生とメモリ空間の関係

GCは,メモリ空間の使用状況に応じて発生します。ここでは,GCが発生するタイミングについて説明します。

注意
RMIを使ってリモートオブジェクトの登録や参照をすると,定期的にGCが発生することがあります。GCが発生するタイミングは,次のどちらかのプロパティにミリ秒単位で指定できます。デフォルトは3600000ミリ秒(1時間)です。
  • sun.rmi.dgc.client.gcIntervalプロパティ
  • sun.rmi.dgc.server.gcIntervalプロパティ
GCが発生するタイミングを変更する場合は,どちらかのプロパティにミリ秒単位で任意の値を指定してください。なお,指定できる値の範囲は,1~Long.MAX_VALUE-1です。詳細は,該当ページ(http://download.oracle.com/javase/6/docs/technotes/guides/rmi/sunrmiproperties.html)を参照してください。
(a) CopyGCが発生するタイミング

CopyGCは,次のタイミングで発生します。

  1. Eden領域へのアロケーションで空き領域が不足した場合
  2. jheapprofコマンドに-copygcオプションを指定して実行した場合
(b) FullGCが発生するタイミング

FullGCは,次のタイミングで発生します。

  1. New領域(Eden領域とSurvivor領域の合計)で使用しているメモリサイズがTenured領域の最大値に対する未使用メモリサイズを上回っている状態の時に,Eden領域へのアロケーションで空き領域が不足した場合
    注意
    上記のタイミングで必ずFullGCが発生するわけではありません。この状況になった場合,JavaVMは,次の値を基にFullGCを発生させるかを決定しています。
    • 過去に発生したCopyGCでNew領域からTenured領域に移動したオブジェクト量に対して,そのCopyGCが発生した時点によって重みを付けて算出した平均値
  2. CopyGCの実施の結果,New領域(Eden領域とSurvivor領域の合計)からTenured領域へのオブジェクトの移動に失敗した場合
  3. New領域とTenured領域のそれぞれの未使用メモリサイズを上回るメモリサイズ(Javaオブジェクトのサイズ)のアロケーション要求があった場合
  4. CopyGCの実施の結果,次のどちらかの状態になった場合
    • 確保済みTenured領域の未使用メモリサイズが10,000バイトを下回った場合
    • CopyGC実施時のTenured領域へのオブジェクトの移動によって,確保済みTenured領域の拡張が発生した場合
  5. java.lang.System.gc()メソッドが実行された場合
  6. Metaspace領域にアロケーションしたいメモリサイズが確保済みMetaspace領域の未使用メモリサイズを上回る場合
  7. javagcコマンドを実行した場合
  8. jheapprofコマンドを実行した場合

JavaVMのチューニングでは,主に1.と3.の発生を抑えることを検討します。

参考
FullGCが発生した場合の要因は,拡張verbosegc情報を使用して確認できます。FullGC発生時に要因を確認する方法については,「7.10 拡張verbosegc情報を使用したFullGCの要因の分析方法」を参照してください。