Hitachi

Cosminexus V11 アプリケーションサーバ 機能解説 拡張編


2.9.2 GC制御の処理の流れ

GC制御は次の流れで処理されます。

図2‒15 GC制御の処理の流れ

[図データ]

  1. メモリ監視

    監視タイマスレッドは,JavaVMのメモリを監視します。(1)に示す条件を満たすと,GC制御機能にGC実行要求が出されます。

  2. リソース排他のチェック

    GC実行要求が出されると,GC制御機能はリソース排他中かどうかを調査します。

  3. FullGCの実行待ち

    リソース排他中の場合,FullGCの実行は待ち状態になります。

  4. 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制御機能は,バッチアプリケーションが使用しているコネクションを調査します。コネクションの調査では,バッチアプリケーションがリソース排他中かどうかを確認します。

次の表にリソースの排他中と見なす状態を示します。

表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のトランザクション処理だけがGC制御の対象となります。

(3) FullGCの実行待ち

リソース排他中と判断されると,メッセージKDJE55024-Iを出力して,FullGCの実行待ち状態になります。リソース排他が一つでもあると,FullGCは待機し続けます。FullGC実行待ちの例を次の図に示します。

図2‒16 FullGC実行待ちの例

[図データ]

この図では,一つのジョブプログラム中で二つのリソースにアクセスしています。リソース排他中にFullGCの実行が要求されると,GC制御機能はFullGCの実行を待機状態にします。二つのリソースアクセスが終了するcon2.commit()が実行されると,排他が解除されます。

(4) GCの実行

リソース排他がなくなると,FullGCが実行されます。

(5) 注意事項