Java VMは、Javaアプリケーションとして実行されるJavaメソッドに対して、必要に応じて自動的にコンパイル処理を行います(動的コンパイル)。
動的コンパイルついては、“7.2.3 動的コンパイル”を参照してください。
動的コンパイル発生状況のログ出力機能では、以下の情報を出力します。
どのJavaメソッドが、いつコンパイルされたかの情報を出力します。
Javaメソッドのコンパイルが、短い間に連続して発生している場合、Javaアプリケーションの実行性能に動的コンパイルが影響を与えている可能性があります。
コンパイラスレッドの動的コンパイル結果情報を出力するオプション
コンパイラスレッドのCPU使用状況および動的コンパイル結果情報を出力する場合に指定します。
-XX:+PrintCompilation |
オプションの指定に関しては、以下のURLを参照してください。
https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html |
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html |
上記のオプションの指定により、動的コンパイルが発生するたびに、その発生状況ログが標準出力へ、以下に示す形式で出力されます。
動的コンパイル結果情報の出力形式
$1: $2 $3 $4 $5 ($6 bytes) $7 |
Javaメソッドのコンパイル要求が発生した時間(ログ出力時の時間)を示します。
時間は、Java VMが起動されてからの経過時間(ミリ秒)です。
コンパイル要求の数(コンパイル要求が発生したJavaメソッドの数)を通し番号で示します。
空白、または、メソッドのコンパイル種別を表す5桁の文字列"%s!bn"を示します。5桁の文字は、それぞれ、動的コンパイラが管理するメソッドの種別を表し、該当しない場合は空白が表示されます。
注意
メソッドのコンパイル種別
メソッドのコンパイル種別を表す5桁の文字列は、動的コンパイラの内部処理を解析するための、保守サポート向けの情報(動的コンパイラ処理ロジックを理解した高度なスキルを必要とする情報です)。このため、種別の説明は省略しています。
動的コンパイラが管理するメソッドのコンパイルレベルを表す数値を示します。
コンパイル要求が発生したJavaメソッドの名前を示します。
Javaメソッドを部分的にコンパイルする要求の場合($2に「%」の表示が含まれる場合)、Javaメソッド名の後に、Javaメソッド(バイトコード)のどの部分からコンパイルの対象になっているかを示す情報「(@ 数字)」が付加されます。
コンパイル対象となったJavaメソッドの大きさ(バイトコード・サイズ)をバイト数で示します。
ネイティブメソッドの場合は、(native)が表示されます。
コンパイル対象となったJavaメソッドが、static修飾子を持つネイティブメソッドだった場合は、“(static)”と出力されます。コンパイル対象となったJavaメソッドが、ネイティブメソッドでない場合、またはstatic修飾子を持たないネイティブメソッドだった場合、この位置には何も出力されません。
“made not entrant”は、これまでにコンパイラによってつくられた機械命令のコードを無効にしたことを示します。
例
-XX:+PrintCompilation指定時の出力例
263 1 3 java.lang.String::hashCode (55 bytes) 266 2 3 java.lang.String::equals (81 bytes) 272 3 n 0 java.lang.System::arraycopy (native) (static) 273 5 4 java.lang.String::charAt (29 bytes) 275 6 4 java.lang.String::length (6 bytes) 276 7 3 java.lang.Character::toLowerCase (9 bytes) 277 8 3 java.lang.CharacterData::of (120 bytes) 278 9 3 java.lang.CharacterDataLatin1::toLowerCase (39 bytes)) 278 10 3 java.lang.CharacterDataLatin1::getProperties (11 bytes) (中略) 1081 108 % 3 java.math.BigInteger::multiplyToLen @ 135 (216 bytes) 1081 108 % 3 java.math.BigInteger::multiplyToLen @ 135 (216 bytes)