2016-05-03 10 views
1

OpenJDK/Oracle 1.6/1.7/1.8 JVMがデフォルトのカードマーキングロジックに準拠していることが記載されている記事があります。 (http://psy-lob-saw.blogspot.hk/2014/10/the-jvm-write-barrier-card-marking.html) しかし、wiki Tracing garbage collectionでは、3色アルゴリズムも優れたパフォーマンスを持つと主張しています。到達可能なオブジェクトをマークするためのjvm使用の三色マーキングアルゴリズムはありますか?

私はとても混乱していますので、jvmで3色マーキングアルゴリズムを使用していますか?言い換えれば、カードマーキングアルゴリズムと比較して、三色マーキングの利点はどこですか?

答えて

1

カードマーキングは個々のオブジェクト用ではありません。それは一度にオブジェクトのセット用です。基本的には、地域間の参照を追跡することです。領域A、B、Cにメモリがあり、A内のすべてのオブジェクトが自己完結型である場合、B内のすべてのオブジェクトは自己完結型であり、C内のすべてのオブジェクトは自己完結型です。カードをマークしました。その結果、ガベージコレクトAに関しては、BまたはCからのオブジェクトがAのオブジェクトに到達可能かどうかを知る必要はありません。したがって、ローカルでそれらをクリーンアップすることができます。

したがって、ガベージコレクションを実行するときにスキャンする必要があるメモリの量を最適化します。

Aのオブジェクトを参照しているBにオブジェクトがある場合、カードテーブルには領域外参照があることが示されます。その結果、ガーベッジ・コレクションAの場合、B内のオブジェクトが存在するかどうかを判断するために、B(より正確には、Bのサブセットが領域外オブジェクトを参照するようにマークされている)をトラバースする必要もありますまだ生きている。そこで、インクリメンタルGCの問題を「すべてのオブジェクト」から「AとBのすべてのオブジェクト」に移動します。この場合、Cは処理されません。

これらのマーキング技術は、オブジェクトのセットに適用できます。彼らは個々のオブジェクトの保持を扱っていません。したがって、カードマーキングと同様に、オブジェクトには、GCアルゴリズムがどのようなものであっても、オブジェクトがマーク/スイープされているかどうかを含むマークフラグ(各インスタンスのマークワードにあります)があります。このフラグには、オブジェクトがマークされているかどうかを示す特殊ケースや、mark word implementationのCMSコレクタに固有のビットなど、このフラグのさまざまなビットが使用されます。ただし、これらの詳細はリリースごとに変更される可能性があり、使用されているGCのタイプによって異なります。

いずれの場合でも、ここでのポイントは、カードマーキングがobjects-pointing-outside-regionのセットを表すためであり、インスタンスがマークされる方法が、使用中のGCに固有の異なるテクニックを使用することです。これは、他者の場合ではありません。

関連する問題