Hitachi

 Hitachi Application Server V10 ユーザーズガイドWindows®用)


3.1.4 G1GCのメモリー構造とGCの流れについて

Javaのメモリー管理の方式にG1GCを選択すると、メモリー領域に対してYoungGC、MixedGC、およびFullGCの3種類のGCが発生します。このうち、YoungGCとMixedGCについては、GC発生時にアプリケーションが停止する時間を制御できます。G1GCを選択する場合、-XX:+UseG1GCオプションのほか、GC発生時の目標の停止時間、メモリーに関するオプションや処理性能のチューニングに関するオプションを指定します。

G1GCのメモリー構造

Javaのメモリー管理の方式にG1GCを選択した場合の、メモリー構造を次の図に示します。

[図データ]

各領域の役割を次の表に示します。

項番

領域の名称

役割

1

Javaヒープ領域

Javaプログラムが使用するメモリー領域です。大きくNew領域とTenured領域に分かれています。

2

New領域

新しいオブジェクトを格納する領域です。Eden領域とSurvivor領域に分かれています。

3

Eden領域

作成直後のオブジェクトを格納する領域です。

4

Survivor領域

1回以上GCを実施した、使用中のオブジェクトを格納する領域です。

5

Tenured領域

長時間使用するオブジェクトを格納する領域です。

6

Metaspace領域

ロードされたクラス情報やメソッド情報を格納する領域です。

7

Cヒープ領域

Developer's Kit for Javaがネイティブライブラリーを実行する際に使用する領域です。

8

スレッドスタック領域

スレッドごとに保持するスタック領域です。

9

New領域の未割り当ての領域

New領域内で、Eden領域またはSurvivor領域に割り当てていない領域です。

10

Humongous領域

サイズの大きいオブジェクトを格納する領域です。Tenured領域の一部で、連続したリージョンを割り当てます。

11

未割り当ての領域

Javaヒープ領域内で、どの領域にも割り当てていない領域です。

G1GCの場合のGCの流れ

G1GCでは、Java ヒープをリージョンというメモリーブロック単位で管理しているため、New領域やTenured領域を連続領域として確保していません。オブジェクトはリージョン内に格納し、リージョンに空きがない場合は、未割り当てのリージョンを領域に割り当て、オブジェクトを格納します。

メモリー管理方式にG1GCを選択した場合のGCの流れを次の図で説明します。

[図データ]

  1. YoungGC

    New 領域に割り当てたリージョンに空きがなくなると、YoungGC が発生します。YoungGCが発生すると、使用中のオブジェクトは Survivor 領域に割り当てたリージョンに移動し、使用済みのオブジェクトはリージョンごと解放します。また、YoungGC発生時に使用中のオブジェクトは、Survivor 領域に割り当てたリージョン間を移動し続け、ある一定の回数移動するとTenured領域に割り当てたリージョンに移動します。YoungGC発生後は、GC に掛かった時間から、次の GC に掛かる時間を予測して、New 領域のサイズを変更します。YoungGC発生後の図は、予測した時間より長くGCに時間が掛かったために、New領域を縮小した場合の例です。

  2. MixedGC

    Tenured 領域の使用率が増加すると、MixedGCが発生します。MixedGCが発生すると、New領域に割り当てたリージョンに加えて、目標停止時間内に収まる範囲で、一部のTenured領域に割り当てたリージョンがGCの対象となります。この一部のTenured領域に割り当てたリージョンは、アプリケーションの実行と並行して行っているオブジェクトが使用中かどうかの解析情報に基づいて、解放されるサイズが大きいと予測されるリージョンから優先してGCの対象となります。そのため、オブジェクトの情報解析が十分に実施されていない場合や、解析の結果MixedGC の効果が低い場合は、 MixedGCは発生しません。

  3. FullGC

    Java ヒープ内のリージョンに空きがなくなり、MixedGCが発生しない場合、Javaヒープ全体を対象としてFullGCが発生します。

G1GCの場合に設定するパラメーター

メモリー管理方式にG1GCを選択した場合、GC によるアプリケーションの停止時間とスループットがシステム要件を満たすように、メモリーの設計やチューニングをする必要があります。なお、G1GC はFullGCの発生によるアプリケーションの停止時間を制御できません。そのため、FullGCが発生している場合、FullGCが発生しないようにチューニングをする必要があります。G1GCの場合に設定するパラメーターを示します。

項番

項目

オプション名

説明

1

G1GCの設定

-XX:+UseG1GC

メモリー管理方式にG1GCを選択します。

2

-XX:MaxGCPauseMillis=目標停止時間

目標停止時間をミリ秒単位で設定します。

3

メモリーの設計

-XmxJavaヒープ領域の最大サイズ

Javaヒープ領域の最大サイズを設定します。

4

-XmsJavaヒープ領域の初期サイズ

Javaヒープ領域の初期サイズを設定します。このパラメーターは、-Xmxオプションと同じ値の設定を推奨します。

5

-XX:MaxMetaspaceSize=Metaspace領域の最大サイズ

Metaspace領域の最大サイズを設定します。

6

-XX:MetaspaceSize=Metaspace領域に起因するFullGC の基準値

Metaspace領域に起因するFullGCの基準値を設定します。Metaspace領域のサイズが基準値を超えるとFullGCが発生するため、アプリケーションで必要なクラス情報のサイズから見積もった値を設定します。このパラメーターは、-XX:MaxMetaspaceSizeオプションと同じ値の設定を推奨します。

7

-XX:CompressedClassSpaceSize=Compressed Class Spaceの最大サイズ

圧縮オブジェクトポインター機能が有効な場合にMetaspace領域内に作成されるCompressed Class Space領域の最大サイズを設定します。このパラメーターは、-XX:MaxMetaspaceSizeオプションと同じ値の設定を推奨します。

8

-XX:SurvivorRatio=New領域に対するSurvivor領域が最大の場合の割合

New領域に対するSurvivor領域が最大サイズの場合の割合を設定します。

9

処理性能のチューニング

-XX:ParallelGCThreads=YoungGCおよびMixedGCを行うスレッド数

YoungGCおよびMixedGCを行うスレッド数を設定します。 ConcGCThreadsのスレッド数に合わせて設定します。

10

-XX:ConcGCThreads=アプリケーションと並行して処理を実行するスレッド数

アプリケーションと並行して処理を実行するスレッド数を設定します。