7.15.3 New領域を対象としたGCの仕組み
JavaVMでは,YoungGCまたはMixedGCの対象になるNew領域のメモリ空間を,Eden領域,Survivor領域に分けて管理します。さらに,Survivor領域は,From空間とTo空間に分けられます。From空間とTo空間は,同じメモリサイズです。
New領域の構成を次の図に示します。
Eden領域は,newによって作成されたオブジェクトが最初に格納される領域です。プログラムでnewが実行されると,Eden領域のメモリが確保されます。
Eden領域がいっぱいになると,YoungGCまたはMixedGCが実行され,次の処理が実行されます。
-
Eden領域およびSurvivor領域のFrom空間にあるJavaオブジェクトのうち,使用中のJavaオブジェクトが,Survivor領域のTo空間にコピーされます。使用されていないJavaオブジェクトは破棄されます。
-
Survivor領域のTo空間とFrom空間が入れ替わります。
この結果,Eden領域とTo空間は空になり,使用中のオブジェクトはFrom空間に存在することになります。
YoungGCまたはMixedGC実行時に発生するオブジェクトの移動を次の図に示します。
このようにして,使用中のオブジェクトは,YoungGCまたはMixedGCが発生するたびに,From空間とTo空間を行ったり来たりします。ただし,寿命の長いオブジェクトを行き来させ続けると,移動処理の負荷などが問題になります。これを防ぐために,From空間とTo空間でJavaオブジェクトを入れ替える回数にしきい値を設定して,年齢がしきい値に達したJavaオブジェクトはTenured領域に移動させるようにします。