iku8blog

Webエンジニアのタダのメモ。

JavaのPrintCompilationを使ってコンパイルプロセスを検証出来るらしい

f:id:iku8:20210127000104j:plain

Javaパフォーマンス本を勉強中

今回はPrintCompilationというJITコンパイラがどう働くのかを確認出来るオプションついて調べてみる。

確認出来ること

PrintCompilationオプションを使って確認出来ること以下

  1. タイムスタンプ
  2. コンパイルID
  3. 属性
  4. メソッド名
  5. コンパイル対象コードのサイズ
  6. 非最適化(ゾンビになったとか)

全体的にざっくりいうと、このオプションを付けることにより

どのプログラムがJITコンパイラによってコンパイルされたのか?

いつコンパイルされたのか?

どういう種類(属性)のコンパイルだったのか?(OSR系なのか、synchronizedなのか、例外ハンドラが含まれているのか?ちょっとよく分からなかった)

とかが分かるらしい。

興味深いところ

興味深いのはOSRコンパイルが出てくるタイミングだった。

PrintCompilationによってコンパイルされる対象の連番は、昇順であるが、OSRが含まれると急に低いIDが出現する。

100 101 102 20 103

みたいな感じで。

この20がOSRだったら、でかいループが回っていて、ようやくJITコンパイラコンパイルしたんだなって思える。

所感

正直PrintCompilationを使って、今開発しているアプリケーションに活かせそうか?と言われると微妙なところだが、 どういうところが、JITコンパイルされているのかは興味があるかもしれない。

実はこの処理OSRでコンパイルされていたのかーとか。

ただ、まだまだ難しい。

その他

起動してるアプリケーションについてはjstatでも見れるらしい。

jstat -compiler プロセス番号