2.9.2 ガーベージコレクション制御の処理の流れ
ガーベージコレクション制御は次の流れで処理されます。
図2-15 ガーベージコレクション制御の処理の流れ
![[図データ]](figure/zu021200.gif)
- メモリ監視
監視タイマスレッドは,JavaVMのメモリを監視します。(1)に示す条件を満たすと,ガーベージコレクション制御機能にガーベージコレクション実行要求が出されます。
- リソース排他のチェック
ガーベージコレクション実行要求が出されると,ガーベージコレクション制御機能はリソース排他中かどうかを調査します。
- フルガーベージコレクションの実行待ち
リソース排他中の場合,フルガーベージコレクションの実行は待ち状態になります。
- フルガーベージコレクションの実行
リソースの排他が解除されると,フルガーベージコレクションが実行されます。
それぞれの処理について説明します。
- <この項の構成>
- (1) メモリ監視
- (2) リソース排他のチェック
- (3) フルガーベージコレクションの実行待ち
- (4) ガーベージコレクションの実行
- (5) 注意事項
(1) メモリ監視
監視タイマスレッドはJavaVMのメモリを監視し,次のどれかの条件を満たす場合,ガーベージコレクション制御機能にガーベージコレクションの実行要求を出します。
- Tenured領域消費サイズ/Tenured領域合計サイズ×100≧ガーベージコレクション制御のしきい値
- New領域合計サイズ/Tenured領域最大空きサイズ×100≧ガーベージコレクション制御のしきい値
- Permanent領域消費サイズ/Permanent領域合計サイズ×100≧ガーベージコレクション制御のしきい値
(2) リソース排他のチェック
ガーベージコレクション実行が要求されると,ガーベージコレクション制御機能は,バッチアプリケーションが使用しているコネクションを調査します。コネクションの調査では,バッチアプリケーションがリソース排他中かどうかを確認します。
次の表にリソースの排他中と見なす状態を示します。
表2-28 リソースの排他中と見なす状態
トランザクション | 状態 | DB Connector | JDBC |
---|
トランザクション外 | SQL文を実行中※1 | - java.sql.Statement#executeの実行中
- java.sql.Statement#executeUpdateの実行中
- java.sql.Statement#executeQueryの実行中
- java.sql.Statement#executeBatchの実行中
| ○ | × |
ResultSetに対する操作中 | - java.sql.ResultSet#deleteRowの実行中
- java.sql.ResultSet#insertRowの実行中
- java.sql.ResultSet#updateRowの実行中
| ○ | × |
オブジェクト取得などの操作中※1 | - java.sql.Statement#addBatchの実行中
- java.sql.Connection#prepareCallの実行中
- java.sql.Connection#prepareStatementの実行中
| ○ | × |
トランザクション中 | - Connection APIによるトランザクション実行中※2
- ローカルトランザクション(JTA)実行中※2
| ○ | × |
グローバルトランザクション(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のトランザクション処理だけがガーベージコレクション制御の対象となります。
(3) フルガーベージコレクションの実行待ち
リソース排他中と判断されると,メッセージKDJE55024-Iを出力して,フルガーベージコレクションの実行待ち状態になります。リソース排他が一つでもあると,フルガーベージコレクションは待機し続けます。フルガーベージコレクション実行待ちの例を次の図に示します。
図2-16 フルガーベージコレクション実行待ちの例
![[図データ]](figure/zu021300.gif)
この図では,一つのジョブプログラム中で二つのリソースにアクセスしています。リソース排他中にフルガーベージコレクションの実行が要求されると,ガーベージコレクション制御機能はフルガーベージコレクションの実行を待機状態にします。二つのリソースアクセスが終了するcon2.commit()が実行されると,排他が解除されます。
(4) ガーベージコレクションの実行
リソース排他がなくなると,フルガーベージコレクションが実行されます。
(5) 注意事項
- 同時に実行できるバッチアプリケーションは一つだけです。
- 一つのバッチアプリケーションから複数のリソースへの処理ができます。ただし,グローバルトランザクションは使用できません。
- フルガーベージコレクションの実行待ち状態でも,空きメモリが不足すると,JavaVMによってフルガーベージコレクションが実行されることがあります。これは,ガーベージコレクション実行時のメモリ使用量のしきい値が大きい場合や,リソースの排他区間が長い場合などに発生します。マニュアル「Cosminexus アプリケーションサーバ システム設計ガイド」の「9.4 ガーベージコレクション制御で使用するしきい値を設定する」を参照して,メモリ使用量のしきい値をチューニングしてください。