7.12.2 明示管理ヒープ機能の稼働情報を取得するための実装
ここでは,アプリケーションで明示管理ヒープ機能の稼働情報を取得するための実装について説明します。稼働情報を取得することで,デバッグや障害解析を実行できます。
アプリケーションで明示管理ヒープ機能を実装している場合,稼働情報として次の情報を取得できます。
-
Explicitヒープの利用状況
-
ExplicitMemoryインスタンスが表すExplicitメモリブロックサイズ
-
Explicitメモリブロックの情報
また,稼働情報の取得に関連した処理として,次の処理も実行できます。
-
Explicitメモリブロックの名前の設定と取得
-
Explicitメモリブロックの処理可能状態の判定
-
Explicitメモリブロックの解放予約状態の判定
ここでは,明示管理ヒープ機能APIを使用した,それぞれの処理の実装について説明します。
- 〈この項の構成〉
(1) Explicitヒープの利用状況の取得
Explicitヒープの情報を取得方法について説明します。Explicitヒープは,Explicitメモリブロック全体のことです。なお,各Explicitメモリブロックの情報を取得する方法については,「7.12.2(3) Explicitメモリブロックの情報の取得」を参照してください。
- 使用するAPI
-
getMemoryUsage()
このAPIは,java.lang.management.MemoryUsageクラスのインスタンスを作成して,そのインスタンスを返却します。
返却されたインスタンスの各フィールドには,インスタンス作成時の情報として,次の表に示す情報が設定されています。
各フィールドが示す値を次の図に示します。
(2) ExplicitMemoryインスタンスが表すExplicitメモリブロックサイズ
Explicitメモリブロックの利用状況として,ExplicitMemoryインスタンスが表すExplicitメモリブロックサイズを取得します。これによって明示管理ヒープ機能でのメモリの使用状況をチェックできます。
- 使用するAPI
-
-
freeMemory()
-
usedMemory()
-
totalMemory()
-
それぞれのAPIで取得できるExplicitメモリブロックの利用状況を次の表に示します。なお,サイズは,long型の値として取得できます。
API |
取得できるExplicitメモリブロックの利用状況 |
---|---|
freeMemory() |
メモリの利用可能なサイズ(単位:バイト) |
usedMemory() |
使用されているメモリのサイズ(単位:バイト) |
totalMemory() |
確保済み総サイズ(単位:バイト) |
各APIで取得できる値を次の図に示します。
(3) Explicitメモリブロックの情報の取得
Explicitヒープに実体があるExplicitメモリブロックの個数を取得します。状態が解放済みまたは無効になっているExplicitメモリブロックは対象になりません。有効なExplicitメモリブロックの個数を取得すると,各Explicitメモリブロックで使用されているメモリの平均サイズなどが算出できるようになります。
- 使用するAPI
-
countExplicitMemories()
このAPIは,Explicitヒープにあるメモリブロックの数を数えて,int型の値として返却します。数える対象になるのは,次の条件を満たしているExplicitメモリブロックです。
-
有効なExplicitメモリブロック
サブ状態が「Enable」または「Disable」のどちらの場合も対象になります。
-
解放予約済みのExplicitメモリブロック
(4) Explicitメモリブロックの名称の設定と取得
Explicitメモリブロックに対応するインスタンスに名称を設定したり,設定されている名称を取得したりできます。Explicitメモリブロックのインスタンスは,アプリケーションで扱いやすいように,名称を持っています。任意の名称を設定することで,インスタンスを利用しやすくなります。
設定した値は,明示管理ヒープ機能のイベントログにも出力されます。
- 使用するAPI
-
-
setName()
名前を設定します。
-
getName()
名前を取得します。
-
なお,ユーザのアプリケーションで名前を設定しない場合,次に示すデフォルトの名前が設定されています。
BasicExplicitMemory-<ID>
<ID>は,JavaVMで管理している値です。
(5) Explicitメモリブロックの処理可能状態の判定
Explicitメモリブロックは,メモリ確保に失敗した場合などに処理不能な状態になることがあります。Explicitメモリブロックが処理可能な状態かどうかを判定できます。
- 使用するAPI
-
isActive()
APIを呼び出したときのExplicitメモリブロック(ExplicitMemoryインスタンス)の状態と,APIの戻り値の対応を次の表に示します。
Explicitメモリブロックの状態 |
サブ状態 |
戻り値 |
---|---|---|
解放済み |
− |
false |
無効 |
− |
false |
解放予約済み |
− |
false |
有効 |
Enable |
true |
Disable |
false |
(6) Explicitメモリブロックの解放予約状態の判定
Explicitメモリブロックが解放予約状態や解放済み状態になったあとでも,そのExplicitメモリブロックに対応するExplicitMemoryインスタンスは参照できます。APIを使用することで,アプリケーションから,Explicitメモリインスタンスの状態を確認できます。
- 使用するAPI
-
isReclaimed()
APIを呼び出したときのExplicitメモリブロック(ExplicitMemoryインスタンス)の状態と,APIの戻り値の対応を次の表に示します。
Explicitメモリブロックの状態 |
サブ状態 |
戻り値 |
---|---|---|
解放済み |
− |
true |
無効 |
− |
true |
解放予約済み |
− |
true |
有効 |
Enable |
false |
Disable |
false |