Java における Scavenge GC と Full GC の違い


Scavenge GC と Full GC の処理の違いは何か教えて下さい。以下については理解しています。

  * Scavenge GC が Eden 領域がいっぱいになった時に実行される
  * MaxTenuringThreshold の回数文、S0 から S1 に移動が発生した場合に、OLD 領域への移動が発生する
  * Old がいっぱいになった時に Full GC が発生する。

つまり、Old に残っているオブジェクトは、どこからか参照されていて、それ故に残っていると考えられます。したがって、Full GC が Scavenge
GC と同様の処理である場合、Old のオブジェクトは、どこからか参照されていると判定されるので、破棄できないのではないかと思いました。

しかし、実際にはそんなはずは無いので、Full GC と Scavenge GC には、不要なオブジェクトを探索するアルゴリズムに差異があるのでは(Full
GC のほうが深く探索するなど)、と推測しているのですが裏付けとなる情報が得られていません。

よろしくお願いします。




Scavenge GC の対象の Eden 領域などを含む NEW
領域は、直近で生成された短命なオブジェクトが残り、しきい値を超えた寿命を持つオブジェクトが OLD 領域に入るだけなので、OLD
領域は寿命の長いオブジェクトが入ることになります。ですので、どちらに居ても、他のオブジェクトから参照されているオブジェクトは破棄されません。

GC の方式としては、Scavenge GC はコピー方式で、Full GC
はマーク・アンド・スイープ方式が採用されている話があります(<http://www.atmarkit.co.jp/ait/articles/0704/24/news136.html>)。が、すこし情報が古いようですね。最近は、特に
Full GC 時の停止期間を少なくするために、コンカレントな GC を Full GC
に採用するのが一般的です(<http://d.hatena.ne.jp/wyukawa/20130103/1357211148>)。Java 7
以降だと、G1GC
という方式も出てきています(<http://nekop.hatenablog.com/entry/20140407/1396858038>)。




Scavenge GC の対象の Eden 領域などを含む NEW
領域は、直近で生成された短命なオブジェクトが残り、しきい値を超えた寿命を持つオブジェクトが OLD 領域に入るだけなので、OLD
領域は寿命の長いオブジェクトが入ることになります。ですので、どちらに居ても、他のオブジェクトから参照されているオブジェクトは破棄されません。

GC の方式としては、Scavenge GC はコピー方式で、Full GC
はマーク・アンド・スイープ方式が採用されている話があります(<http://www.atmarkit.co.jp/ait/articles/0704/24/news136.html>)。が、すこし情報が古いようですね。最近は、特に
Full GC 時の停止期間を少なくするために、コンカレントな GC を Full GC
に採用するのが一般的です(<http://d.hatena.ne.jp/wyukawa/20130103/1357211148>)。Java 7
以降だと、G1GC
という方式も出てきています(<http://nekop.hatenablog.com/entry/20140407/1396858038>)。

