GC制御は次の流れで処理されます。
図2-15 GC制御の処理の流れ
それぞれの処理について説明します。
監視タイマスレッドはJavaVMのメモリを監視し,次のどれかの条件を満たす場合,GC制御機能にGCの実行要求を出します。
GC実行が要求されると,GC制御機能は,バッチアプリケーションが使用しているコネクションを調査します。コネクションの調査では,バッチアプリケーションがリソース排他中かどうかを確認します。
次の表にリソースの排他中と見なす状態を示します。
表2-28 リソースの排他中と見なす状態
トランザクション | 状態 | DB Connector | JDBC | |
---|---|---|---|---|
トランザクション外 | SQL文を実行中※1 |
| ○ | × |
ResultSetに対する操作中 |
| ○ | × | |
オブジェクト取得などの操作中※1 |
| ○ | × | |
トランザクション中 |
| ○ | × | |
グローバルトランザクション(JTA)実行中 | - | - |
(凡例)○:リソース排他中として扱う ×:リソース排他がないものとして扱う
-:該当しない
注※1 表中のjava.sql.Statementは,サブインタフェースであるjava.sql.PreparedStatement,java.sql.CallableStatementを含みます。
注※2 トランザクションの開始後(setAutoCommit(false)やUserTransaction.beginの実行後),SQL文の実行またはResultSetに対する操作を1回以上実行していて,トランザクションの決着処理が完了していない状態を指します。
JDBCを使用したリソース操作については,リソース排他がないものとして扱われます。例えば,JDBCのSQL文の実行と,DB Connectorでのトランザクション処理が混在するプログラムを実行した場合,DB Connectorのトランザクション処理だけがGC制御の対象となります。
リソース排他中と判断されると,メッセージKDJE55024-Iを出力して,FullGCの実行待ち状態になります。リソース排他が一つでもあると,FullGCは待機し続けます。FullGC実行待ちの例を次の図に示します。
図2-16 FullGC実行待ちの例
この図では,一つのジョブプログラム中で二つのリソースにアクセスしています。リソース排他中にFullGCの実行が要求されると,GC制御機能はFullGCの実行を待機状態にします。二つのリソースアクセスが終了するcon2.commit()が実行されると,排他が解除されます。
リソース排他がなくなると,FullGCが実行されます。