7.13.1 アプリケーション内にTenured領域の増加原因のオブジェクトがある場合
アプリケーション内にTenured領域の増加原因のオブジェクトがある場合,自動配置設定ファイルを使用してオブジェクトをExplicitヒープに配置することをお勧めします。オブジェクトの配置を検討した方がよいJavaプログラムの例を次に示します。
01:package abcd.efg; 02:import java.util.HashMap; 03:// KVStorageのインスタンスは,長期間生存し続ける 04:class KVStorage { 05: HashMap _map = new HashMap(); 06: 07: public void store(MyKey k,MyData d) { 08: // ...前処理... 09: _map.put(k,d); 10: // ...後処理... 11: } 12: 13: public MyData load(MyKey k) { 14: // ...前処理... 15: MyData d = map.get(k); 16: // ...後処理... 17: return d; 18: } 19:}
この設定例の場合,KVStorageがインスタンスフィールドに保持しているHashMapクラスがTenured領域のメモリサイズ増加の要因となる長寿命オブジェクトとなります。このオブジェクトの生成先をExplicitヒープへ変更する場合,次の例のように自動配置設定ファイルを指定します。
# 生成個所(メソッド名やクラス名), 生成するクラス名 の対で記載。 abcd.efg.KVStorage.<init>, java.util.HashMap
この例のように自動配置設定ファイルを指定することで,Javaプログラムの例の5行目のHashMapインスタンス(_map)の生成先がJavaヒープからExplicitヒープに変更されます。また,storeメソッドで_mapに格納したMyKeyのインスタンス,およびMyDataのインスタンスも,順次Explicitヒープに移動されます。これらのインスタンスは,不要となった時点でJavaVMによって自動的に解放されます。