7.13.2 自動配置設定ファイルを使った明示管理ヒープ機能の使用
明示管理ヒープ機能の自動配置機能は,自動配置設定ファイルを使って設定します。自動配置設定ファイルを使用することで,Javaプログラムを変更することなく明示管理ヒープ機能を使用できます。
自動配置設定ファイルには,Explicitヒープに配置したいオブジェクト,およびオブジェクトを生成する場所を指定します。なお,このファイルに指定したオブジェクト(Explicitメモリブロックに生成されたオブジェクト)から参照されているオブジェクトは,JavaヒープからExplicitメモリブロックへ移動します。オブジェクトの移動については「7.6.5 参照関係に基づくオブジェクトのJavaヒープからExplicitメモリブロックへの移動」を参照してください。
-XX:+HitachiAutoExplicitMemoryオプションを指定して,自動配置設定ファイルを使用して明示管理ヒープ機能を利用する場合の,自動配置設定ファイルの記述形式および記述する際の注意事項について説明します。
自動配置設定ファイルの内容は次のどれかに記述できます。
-
簡易構築定義ファイル
-
運用管理ポータルの[起動パラメタの設定]画面(論理J2EEサーバの定義)
-
ユーザ任意のファイル(jvm.userprf.Fileプロパティで指定したファイル)
(1) 自動配置設定ファイルの記述形式
自動配置設定ファイルの記述形式を次に示します。
<生成点>※, <指定したオブジェクトの完全修飾クラス名> # コメント : <生成点>※, <指定したオブジェクトの完全修飾クラス名>
- 注※
-
生成点の指定例を次に示します。
生成点の指定例
意味
*
すべてのパッケージのすべてのクラスに含まれる,すべてのメソッドでの,ユーザ指定オブジェクトの生成を生成点として指定します。
com.sample.*
com.sampleで始まるすべてのパッケージのクラスに含まれるメソッドでの,ユーザ指定オブジェクトの生成を生成点として指定します。
そのため,下位のパッケージ(com.sample.abc,またはcom.sample.abc.test)が存在する場合は,これらのパッケージも対象となります。
com.sample.Main
com.sample.Mainクラスに含まれるすべてのメソッド(コンストラクタ,および静的初期化子を含む)でのユーザ指定オブジェクトの生成を生成点として指定します。
com.sample.Main.main(java.lang.String[])
com.sample.Mainクラスで定義されたmain(java.lang.String[])メソッドでのユーザ指定オブジェクトの生成を生成点として指定します。
- ポイント
-
-
構文要素を区切る空白文字は,半角スペース文字(「0x20」)またはタブ文字(「\t」もしくは「0x09」)となります。
-
行末は改行文字(「\n」もしくは「0x0A」)または復帰文字(「\r」もしくは「0x0D」)が1文字以上続いたものとなります。
-
コメントは「#」で始まり,「#」から行末までの間の文字すべてをコメントとします。
-
生成点での文字「*」は,同一またはサブパッケージに存在するすべてのクラスを表します。サブパッケージのクラスも対象とする点で,Java言語のimport宣言の「*」と生成点の「*」は意味が異なります。
-
(2) 自動配置設定ファイルの記述例
自動設定ファイルの記述例を次に示します。
# comment com.sample.*, java.util.ArrayList # comment com.sample.Main.main(java.lang.String[]), java.util.LinkedList
記述例の内容について説明します。
-
1行目はすべてコメントとなります。
-
com.sample.* で始まるすべてのパッケージに含まれる,クラス,およびメソッドで生成されるjava.util.ArrayListオブジェクトを,Explicitメモリブロックに配置するように指定します。「#」から行末まではコメントとします。
-
com.sample.Main.main(java.lang.String[])メソッドで生成されるjava.util. LinkedListオブジェクトをExplicitメモリブロックに配置するように指定します。
- 参考
-
JavaVM内のクラス(例:java, javaxで始まるパッケージのクラス)をユーザ指定オブジェクトの生成点として指定したエントリを記述できます。しかし,指定したエントリが存在しないものとして扱われることがあります。存在しないものとして扱われた場合は,明示管理ヒープログへエラーメッセージは出力されません。
(3) 自動配置設定ファイルの注意事項
自動配置設定ファイルを指定する場合の注意事項を次に示します。
-
自動配置機能を使用することで,クラスローディング時間が増加し,その結果JavaVMの起動時間やアプリケーションサーバでのアプリケーションのデプロイ時間が増加する場合があります。
-
自動配置機能を使用することで,CopyGCの処理に時間が掛かる場合があります。
-
自動配置機能の対象となるオブジェクトは,newで生成しているオブジェクトだけです。JNIやリフレクションで生成しているオブジェクトは対象になりません。
-
クラス名,およびメソッドの引数は,java.langパッケージのクラスも含め,すべて完全修飾クラス名で記述してください。
- (例)
-
誤:String
正:java.lang.String
-
ジェネリックス(総称)を用いたクラス名は記述できません。パラメタ化されていないクラス名(raw型)を記述してください。
- (例)
-
誤:java.util.HashMap<java.lang.String, java.lang.Object>
正:java.util.HashMap
-
ネストしたクラスは,「.」ではなく「$」で区切った名前を記述してください。
- (例)
-
誤:java.util.AbstractMap.SimpleEntry
正:java.util.AbstractMap$SimpleEntry
-
コンストラクタは,クラス名と同じメソッド名,または<init>と記述してください。MyMainクラスのコンストラクタの場合は次のように記述してください。
- (例)
-
MyMain.MyMain()またはMyMain.<init>()
-
クラス名と同じ名前のメソッドが存在する場合,コンストラクタを指定しているのか,メソッドを指定しているのか判別できません。そのため,コンストラクタ,およびメソッドの両方を指定したものとして扱われます。
- (例)
-
MyMain.MyMain(int) # MyMainクラスのint引数を持つコンストラクタと# MyMain(int)メソッドの両方を生成点とする
-
静的初期化子は,<clinit>と記述してください。MyMainクラスの静的初期化子の場合,次のように記述します。
- (例)
-
MyMain.<clinit>()
-
フィールド宣言時の代入によるオブジェクトの生成を生成点に指定する場合,生成点にデフォルトコンストラクタを記述します。
-
ユーザ指定オブジェクトの完全修飾クラス名に配列を指定することはできません。
- (例)
-
java.lang.String[]
-
存在しないクラス名,メソッド名,およびバイトコードを持たないメソッド(nativeメソッドおよびabstractメソッド)を含む行が存在する場合,その行は存在しないものとして扱います。
-
ユーザ指定オブジェクトのクラス名にJ2SEの内部クラスを指定した場合,明示管理ヒープ機能が適切なクラス名に読み替えることがあります。例えば,java.util.HashMap$Entryをjava.util.HashMapに読み替えます。
-
生成点としてJava言語仕様の限界に近い巨大なクラスやメソッドを指定した場合,自動配置に失敗する場合があります。この場合,明示管理ヒープ機能のイベントログの明示管理ヒープ自動配置エラーの<MESSAGE>として,"Invalid class file format"と出力されます。このような場合は,クラスやメソッドを小さくすることを検討してください。