8.12.2 明示管理ヒープ機能の稼働情報を取得するための実装

ここでは,アプリケーションで明示管理ヒープ機能の稼働情報を取得するための実装について説明します。稼働情報を取得することで,デバッグや障害解析を実行できます。

アプリケーションで明示管理ヒープ機能を実装している場合,稼働情報として次の情報を取得できます。

また,稼働情報の取得に関連した処理として,次の処理も実行できます。

ここでは,明示管理ヒープ機能APIを使用した,それぞれの処理の実装について説明します。

<この項の構成>
(1) Explicitヒープの利用状況の取得
(2) ExplicitMemoryインスタンスが表すExplicitメモリブロックサイズ
(3) Explicitメモリブロックの情報の取得
(4) Explicitメモリブロックの名称の設定と取得
(5) Explicitメモリブロックの処理可能状態の判定
(6) Explicitメモリブロックの解放予約状態の判定

(1) Explicitヒープの利用状況の取得

Explicitヒープの情報を取得方法について説明します。Explicitヒープは,Explicitメモリブロック全体のことです。なお,各Explicitメモリブロックの情報を取得する方法については,「(3) Explicitメモリブロックの情報の取得」を参照してください。

使用するAPI
getMemoryUsage()

このAPIは,java.lang.management.MemoryUsageクラスのインスタンスを作成して,そのインスタンスを返却します。

返却されたインスタンスの各フィールドには,インスタンス作成時の情報として,次の表に示す情報が設定されています。

表8-11 各フィールドの情報(MemoryUsageクラスのインスタンス)

フィールド設定内容
init0
usedExplicitヒープの使用されているメモリのサイズ(単位:バイト)
committedExplicitヒープの確保済みサイズ(単位:バイト)
max-XX:HitachiExplicitHeapMaxSizeで指定した最大Explicitヒープサイズの値(単位:バイト)
ただし,明示管理ヒープ機能がオフの場合(-XX:-HitachiUseExplicitMemoryが設定されている場合)は,0になります。

各フィールドが示す値を次の図に示します。

図8-25 各フィールドが示す値(MemoryUsageクラスのインスタンス)

[図データ]

(2) ExplicitMemoryインスタンスが表すExplicitメモリブロックサイズ

Explicitメモリブロックの利用状況として,ExplicitMemoryインスタンスが表すExplicitメモリブロックサイズを取得します。これによって明示管理ヒープ機能でのメモリの使用状況をチェックできます。

使用するAPI
  • freeMemory()
  • usedMemory()
  • totalMemory()

それぞれのAPIで取得できるExplicitメモリブロックの利用状況を次の表に示します。なお,サイズは,long型の値として取得できます。

表8-12 各APIで取得できるExplicitメモリブロックの利用状況

API取得できるExplicitメモリブロックの利用状況
freeMemory()メモリの利用可能なサイズ(単位:バイト)
usedMemory()使用されているメモリのサイズ(単位:バイト)
totalMemory()確保済み総サイズ(単位:バイト)

各APIで取得できる値を次の図に示します。

図8-26 各APIで取得できる値

[図データ]

(3) Explicitメモリブロックの情報の取得

Explicitヒープに実体があるExplicitメモリブロックの個数を取得します。状態が解放済みまたは無効になっているExplicitメモリブロックは対象になりません。有効なExplicitメモリブロックの個数を取得すると,各Explicitメモリブロックで使用されているメモリの平均サイズなどが算出できるようになります。

使用するAPI
countExplicitMemories()

このAPIは,Explicitヒープにあるメモリブロックの数を数えて,int型の値として返却します。数える対象になるのは,次の条件を満たしているExplicitメモリブロックです。

(4) Explicitメモリブロックの名称の設定と取得

Explicitメモリブロックに対応するインスタンスに名称を設定したり,設定されている名称を取得したりできます。Explicitメモリブロックのインスタンスは,アプリケーションで扱いやすいように,名称を持っています。任意の名称を設定することで,インスタンスを利用しやすくなります。

設定した値は,明示管理ヒープ機能のイベントログにも出力されます。

使用するAPI
  • setName()
    名前を設定します。
  • getName()
    名前を取得します。

なお,ユーザのアプリケーションで名前を設定しない場合,次に示すデフォルトの名前が設定されています。

BasicExplicitMemory-<ID>

<ID>は,JavaVMで管理している値です。

注意
Explicitメモリブロックの名称として,「CCC#」で始まる名前は付けないでください。「CCC#」で始まる名称は,J2EEサーバが使用します。
J2EEサーバで使用するExplicitメモリブロックの名称は次のとおりです。
  • CCC#HttpSession
    HTTPセッションを配置するExplicitメモリブロックです。
  • CCC#HttpSessionManager
    HTTPセッション管理用オブジェクトを配置するExplicitメモリブロックです。
  • CCC#Ajp13
    リダイレクタとの通信用オブジェクトを配置するExplicitメモリブロックです。

(5) Explicitメモリブロックの処理可能状態の判定

Explicitメモリブロックは,メモリ確保に失敗した場合などに処理不能な状態になることがあります。Explicitメモリブロックが処理可能な状態かどうかを判定できます。

使用するAPI
isActive()

APIを呼び出したときのExplicitメモリブロック(ExplicitMemoryインスタンス)の状態と,APIの戻り値の対応を次の表に示します。

表8-13 isActive()を呼び出したときのExplicitメモリブロックの状態とAPIの戻り値の対応

Explicitメモリブロックの状態サブ状態戻り値
解放済みfalse
無効false
解放予約済みfalse
有効Enabletrue
Disablefalse
(凡例)
-:該当しません。

(6) Explicitメモリブロックの解放予約状態の判定

Explicitメモリブロックが解放予約状態や解放済み状態になったあとでも,そのExplicitメモリブロックに対応するExplicitMemoryインスタンスは参照できます。APIを使用することで,アプリケーションから,Explicitメモリインスタンスの状態を確認できます。

使用するAPI
isReclaimed()

APIを呼び出したときのExplicitメモリブロック(ExplicitMemoryインスタンス)の状態と,APIの戻り値の対応を次の表に示します。

表8-14 isReclaimed()を呼び出したときのExplicitメモリブロックの状態とAPIの戻り値の対応

Explicitメモリブロックの状態サブ状態戻り値
解放済みtrue
無効true
解放予約済みtrue
有効Enablefalse
Disablefalse
(凡例)
-:該当しません。