0

Eden スペースの若い世代がいっぱいになると、マイナー GC がトリガーされます。また、マイナー GC プロセスでは、Eden と 1 つのソース Survivor スペース内の非フリー オブジェクトが別の宛先 Survivor スペースにコピーされます。

私の質問は、宛先の Survivor スペースがいっぱいの場合、マイナー GC はどのように処理できるのでしょうか?

4

2 に答える 2

1

若い世代には、Eden Space、Survivor1、Survivor2 の 3 つのセグメントがあります。これらは、若い世代の論理的な区分にすぎません。したがって、オブジェクトは Eden Space から Survivor1 にコピーされ、次に Survivor2 にコピーされます。

したがって、マイナー コレクションとは、一般的にコレクションが Young 世代で発生することを意味します。Young 世代がいっぱいの場合、オブジェクトは Old 世代にコピーされます。

繰り返しになりますが、コレクションがマイナーまたはメジャーであるかどうかは、複数の要因によって異なります。そのうちの 1 つは、若い世代のスペースの可用性です。そのため、Young 世代にオブジェクトの割り当てに十分なスペースがある場合、それはマイナー コレクションになります。しかし、YG に十分な空き容量がない場合、同じコレクションがメジャーになる可能性があります。

また、JVM 仕様では、ガベージ コレクションについては何も言及されていません。したがって、独自の戦略を持つことは JVM 実装者に任されています。

于 2012-12-07T13:52:34.993 に答える
1

マイナー コレクションを実行または完了することができない場合は、メジャー コレクションまたはフル コレクションが実行されます。これは通常、アルゴリズムをコピーするのではなく、mark-sweep-compact アルゴリズムを使用して行われます...これが、完全なコレクションが高価な理由の 1 つです。

しかし、最終的に (ヒープをいっぱいにし続けると) 完全なコレクションは続行するのに十分なスペースを再利用できなくなり、OOME がスローされます。(または、 を使用している-XX:+UseGCOverheadLimit場合、GC で費やされた時間のパーセンテージが指定されたしきい値を超えると、OOME がスローされます。)

于 2012-12-07T14:21:17.510 に答える