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