2.9.2 GC制御の処理の流れ
GC制御は次の流れで処理されます。
-
メモリ監視
監視タイマスレッドは,JavaVMのメモリを監視します。(1)に示す条件を満たすと,GC制御機能にGC実行要求が出されます。
-
リソース排他のチェック
GC実行要求が出されると,GC制御機能はリソース排他中かどうかを調査します。
-
FullGCの実行待ち
リソース排他中の場合,FullGCの実行は待ち状態になります。
-
FullGCの実行
リソースの排他が解除されると,FullGCが実行されます。
それぞれの処理について説明します。
(1) メモリ監視
監視タイマスレッドはJavaVMのメモリを監視し,次のどれかの条件を満たす場合,GC制御機能にGCの実行要求を出します。
- SerialGCが有効な場合
-
-
Tenured領域消費サイズ/Tenured領域合計サイズ×100≧GC制御のしきい値
-
New領域合計サイズ/Tenured領域最大空きサイズ×100≧GC制御のしきい値
-
Metaspace領域消費サイズ/Metaspace領域最大サイズ×100≧GC制御のしきい値
-
- G1GCが有効な場合
-
-
Javaヒープ領域消費サイズ/Javaヒープ領域合計サイズ×100≧GC制御のしきい値
-
Metaspace領域消費サイズ/Metaspace領域最大サイズ×100≧GC制御のしきい値
-
- ZGCが有効な場合
-
-
Metaspace領域消費サイズ/Metaspace領域最大サイズ×100≧GC制御のしきい値
-
(2) リソース排他のチェック
GC実行が要求されると,GC制御機能は,バッチアプリケーションが使用しているコネクションを調査します。コネクションの調査では,バッチアプリケーションがリソース排他中かどうかを確認します。
次の表にリソースの排他中と見なす状態を示します。
トランザクション |
状態 |
DB Connector |
JDBC |
|
---|---|---|---|---|
トランザクション外 |
SQL文を実行中※1 |
|
○ |
× |
ResultSetに対する操作中 |
|
○ |
× |
|
オブジェクト取得などの操作中※1 |
|
○ |
× |
|
トランザクション中 |
|
○ |
× |
|
グローバルトランザクション(JTA)実行中 |
− |
− |
JDBCを使用したリソース操作については,リソース排他がないものとして扱われます。例えば,JDBCのSQL文の実行と,DB Connectorでのトランザクション処理が混在するプログラムを実行した場合,DB Connectorのトランザクション処理だけがGC制御の対象となります。
(3) FullGCの実行待ち
リソース排他中と判断されると,メッセージKDJE55024-Iを出力して,FullGCの実行待ち状態になります。リソース排他が一つでもあると,FullGCは待機し続けます。FullGC実行待ちの例を次の図に示します。
この図では,一つのジョブプログラム中で二つのリソースにアクセスしています。リソース排他中にFullGCの実行が要求されると,GC制御機能はFullGCの実行を待機状態にします。二つのリソースアクセスが終了するcon2.commit()が実行されると,排他が解除されます。
(4) GCの実行
リソース排他がなくなると,FullGCが実行されます。
(5) 注意事項
-
同時に実行できるバッチアプリケーションは一つだけです。
-
一つのバッチアプリケーションから複数のリソースへの処理ができます。ただし,グローバルトランザクションは使用できません。
-
FullGCの実行待ち状態でも,空きメモリが不足すると,JavaVMによってFullGCが実行されることがあります。これは,GC実行時のメモリ使用量のしきい値が大きい場合や,リソースの排他区間が長い場合などに発生します。マニュアル「アプリケーションサーバ システム設計ガイド」の「9.4 GC制御で使用するしきい値を設定する」を参照して,メモリ使用量のしきい値をチューニングしてください。