Hitachi

Cosminexus V11 アプリケーションサーバ システム設計ガイド


7.15.6 リージョンの使われ方

オブジェクトが作成されると,最初にEdenリージョンに格納されます。1つのオブジェクトのサイズが,リージョンサイズの半分を越えている大きいオブジェクトの場合は,1つのオブジェクトに対し,連続した複数のリージョンが割り当てられ格納されます。連続した複数のリージョンはFree領域から確保され,Humongous領域に割り当てられます。Humongous領域はFullGCまたはConcurrent Cleanupでだけ回収の対象となるため,サイズの大きなオブジェクトが多数作成されるような場合には,G1GCは不向きとなります。詳細については,「7.16.3(1) FullGCの発生を抑止する考え方」を参照してください。

また,1つのリージョンのサイズは,起動時にJavaヒープ領域の初期サイズの比率から求められ,起動中は固定です。1つのリージョンの最小サイズは1MBであり,最大サイズは32MBです。

注※

ここでいうサイズの大きな1つのオブジェクトとは,多数のインスタンスフィールドを持つオブジェクトや長大な配列を持つオブジェクトのことを指します。リージョンのサイズが1MBの場合,512KBを超えるようなオブジェクトを指し,例えば約13万個のint型のインスタンスフィールドを持つようなオブジェクトや約50万個の要素数のバイト配列を持つオブジェクトなどが当てはまります。

次にリージョンの使用から回収までの流れを示します。

図7‒24 リージョンの使われ方

[図データ]

上図はリージョンの使われ方を示した図です。図の1.〜4.の処理の詳細を次に示します。

  1. オブジェクト作成時

    オブジェクトが作成される場合,Edenリージョンにオブジェクトを格納します。サイズの大きなオブジェクトを作成する場合は,FreeリージョンをHumongousリージョンに割り当てオブジェクトを格納します。Edenリージョンに空き領域がなくなると,新しいEdenリージョンにオブジェクトを格納し,Humongousリージョンに空き領域がなくなると,新たにFreeリージョンからHumongousリージョンを割り当て,オブジェクトを格納します。

  2. GC時の選択処理

    GCの要件を満たすと,実行するGC方式の基準に従って,対象とするリージョンを選択します。

  3. GC時のEvacuation

    回収の対象となったリージョン内で使用中のオブジェクトは,ほかのリージョンにコピーされます。この処理をEvacuationといいます。Evacuation後のリージョンは,使用済みのオブジェクトとコピー済みである不要となったオブジェクトだけ格納されているため,リージョン単位で回収されます。

  4. GC後

    回収されたリージョンはFreeリージョンとなり,再利用されます。