7.12.1 オブジェクトをExplicitヒープに配置するための実装
ここでは,明示管理ヒープ機能APIのクラスの概要と,APIの基本的な利用方法について説明します。
(1) ExplicitMemoryインスタンスとExplicitメモリブロックの関係
Explicitヒープ内のExplicitメモリブロックは,明示管理ヒープ機能APIで扱うExplicitMemoryクラスのインスタンスと1:1で対応します。
ExplicitMemoryインスタンスとExplicitメモリブロックの関係を次の図に示します。
Explicitメモリブロックは,ExplicitMemoryクラスのコンストラクタを実行すると初期化されます。以降は,初期化されたインスタンスが,Explicitメモリブロックを操作するためのインタフェースになります。図の場合は,インスタンスem1がExplicitメモリブロック1に,インスタンスem2がExplicitメモリブロック2に対応しています。
(2) 明示管理ヒープ機能APIのクラス構成
明示管理ヒープ機能APIのクラスを次の表に示します。
クラス |
説明 |
---|---|
MemoryAreaクラス |
JavaヒープまたはExplicitメモリブロックを表現する抽象クラスです。 |
ExplicitMemoryクラス |
Explicitメモリブロックを表現する抽象クラスです。このクラスの機能は,派生クラスであるBasicExplicitMemoryクラスを介して利用します。 |
BasicExplicitMemoryクラス |
アプリケーションで扱うExplicitメモリブロックを表現するクラスです。アプリケーションでは,このクラスのAPIを使用して明示管理ヒープ機能を実装します。 |
クラスの階層を次の図に示します。
(3) 明示管理ヒープ機能APIの利用方法
基本的な操作とメソッドの対応は次のとおりです。
-
Explicitメモリブロックへのオブジェクトの直接生成
newArrayメソッドまたはnewInstanceメソッドを利用します。
-
Explicitメモリブロックの解放
reclaimメソッドを使用します。
次に,BasicExplicitMemoryクラスの利用例を示します。この例では,二つのExplicitメモリブロックを作成します。
BasicExplicitMemoryクラスの利用例
行 |
Javaプログラム |
---|---|
01 02 03 04 05 06 07 08 |
BasicExplicitMemory em1 = new BasicExplicitMemory(); BasicExplicitMemory em2 = new BasicExplicitMemory(); Object o1 = em1.newInstance(Object.class); Object o2 = em2.newInstance(Object.class); ExplicitMemory.reclaim(em1); |
01行目と02行目では,BasicExplicitMemoryインスタンスを生成しています。この例では,em1がExplicitメモリブロック1,em1がExplicitメモリブロック2に対応するものとします。
04行目および06行目のnewInstanceメソッドによって,Explicitメモリブロックにオブジェクトを直接生成します。04行目では,em1インスタンスからnewInstanceメソッドを呼び出すことで,ObjectクラスのオブジェクトをExplicitメモリブロック1に配置します。06行目では,em2インスタンスからnewInstanceメソッドを呼び出すことで,ObjectクラスのオブジェクトをExplicitメモリブロック2に配置します。
Explicitメモリブロックが不要になったら,Explicitメモリブロックを破棄します。08行目のExplicitMemory.reclaim(em1)メソッドの実行は,Explicitメモリブロック1を解放するための処理です。これによって,Explicitメモリブロック1が解放され,同時に04行目で生成したオブジェクトo1も破棄されます。なお,Explicitメモリブロックの解放は,オブジェクト単位ではなく,該当のExplicitメモリブロックに対応する領域全体が対象になります。
この例の場合,Explicitメモリブロック1の生存期間は,01行目から08行目になります。