OpenJDKのJIT解析用オプション

自分用メモ

## 関連リソース
* [Java Platform, Standard Edition Tools Reference](https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html)
* [Java HotSpot VM Options](https://www.oracle.com/technetwork/articles/java/vmoptions-jsp-140102.html)
* [OpenJDK のビルドやデバッグ](https://blog.tiqwab.com/2019/07/08/openjdk-build.html)
* [Hotspot VMの基本構造を理解する](https://www.atmarkit.co.jp/ait/articles/0403/11/news096_2.html)
* [JVMのオプションを一覧する方法について](https://qiita.com/taichi@github/items/7d2bb7d4af7fec8530c3)
  * `java -XX:+PrintFlagsFinal -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions`
* [Useful JVM Flags – Part 1 (JVM Types and Compiler Modes)](https://blog.codecentric.de/en/2012/07/useful-jvm-flags-part-1-jvm-types-and-compiler-modes/)
* [JVM JIT-compiler overview](http://cr.openjdk.java.net/~vlivanov/talks/2015_JIT_Overview.pdf)

## 主要なオプション

### -server
サーバ用VMを起動

### -client
クライアント用VMを起動 (64bit JDKではこのオプションは無視される)

### -Xint
JITコンパイルしない

### -Xcomp
インタプリタ実行を無効にし (-Xintの真逆)、初回の呼び出しでコンパイルするようにする。
インタプリタでプロファイルするタイミングがないのでこれは当然普通にJITするのに比べ遅くなる。

### -Xmixed
ネイティブコードにコンパイルされるホットなメソッド以外はインタプリタ実行する。これはつまりデフォルトなので普通は使う必要がない…

### -Xbatch (-XX:-BackgroundCompilation)
JITコンパイルをフォアグラウンドで実行

### -XX:CompileThreshold=10000
インタプリタ実行される回数。これを越えるとJITされる。

ただしこれは -XX:-TieredCompilation じゃないと使われないらしい。

### -XX:+PrintAssembly
requires: -XX:+UnlockDiagnosticVMOptions

disassembler.so を使ってbytecoded / nativeなメソッドのアセンブリコードを出力する

### -XX:+PrintCompilation
JITしたメソッド名と生成コードサイズを表示する

### -XX:+PrintInlining
requires: -XX:+UnlockDiagnosticVMOptions

インライン化の決定をプリントする。

### -XX:+PrintInterpreter
[hsdis (hotspot disassembly)](https://blog.tiqwab.com/2019/07/08/openjdk-build.html) がある状態だとインタプリタ用の生成コードを出力できるらしい?

### -XX:+PrintStubCode
[hsdis](https://blog.tiqwab.com/2019/07/08/openjdk-build.html) がある状態だとスタブコードの生成コードを出力できるらしい?

### -XX:+CITime
JITに要した時間を表示する

### -XX:TieredStopAtLevel=n
以下のレベルがサポートされている。([ソース](http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/2b2511bd3cc8/src/share/vm/runtime/advancedThresholdPolicy.hpp#l34))

* level 0 - interpreter
* level 1 - C1 with full optimization (no profiling)
* level 2 - C1 with invocation and backedge counters
* level 3 - C1 with full profiling (level 2 + MDO)
* level 4 - C2

### -XX:-TieredCompilation
上記のlevel 1~3を無効にし、インタプリタ実行かC2かの二択にする

### -XX:+OnStackReplacement
OSR有効化。 -XX:-OnStackReplacementで無効にできる

## その他のオプション
### -XX:InlineSmallCode=n
インライン化する最大のネイティブコードサイズ

### -XX:MaxInlineSize=35
インライン化する最大のバイトコードサイズ

### -XX:FreqInlineSize=n
頻繁に実行されるメソッドのうちインライン化される最大のバイトコードサイズ (デフォルトは環境により異なる)

### -XX:ReservedCodeCacheSize=32m
最大コードキャッシュサイズ。amd64だと2048mがデフォルト?

### -XX:AllocatePrefetchLines=1, -XX:AllocatePrefetchStyle=1
オブジェクトアロケーション後のプリフェッチ命令に関する設定

### -XX:+DisplayVMOutputToStderr
VMの出力をstderrに出せるっぽい?

### -XX:+LogCompilation -XX:LogFile=/tmp/compilation.log
JITコンパイルのログを出せる?

ネイティブコードのどれがどのメソッドなのか調べられるらしい ([How to debug compiled (JIT generated) code in Hotspot (OpenJDK JVM – Linux x86_64)?](https://martin.uy/blog/how-to-debug-compiled-jit-generated-code-in-hotspot-openjdk-jvm-linux-x86_64/))

### -XX:CompileCommand, -XX:CompileCommandFile
JIT対象の指示ができる。後述の.hotspot_compilerと同じ機能っぽい。

## 設定ファイル
### .hotspot_compiler
exclude, dontinline, compileonly などJIT対象メソッドを指定できる

### .hotspotrc
-XX: 以外の部分を羅列してオプションを指定できる?