Javaパフォーマンスを読んでる。
自分なりに理解した内容をメモる。
4章: JITコンパイラの仕組み
javaコードは一度Javaバイトコード(バイナリとコードの中間地点)に変換される。
JavaバイトコードをJavaバイナリが読み取り各環境に対応したCPU命令に変換して実行していく。(1行ごとに読みこんでインタプリタ的に実行)
何度も繰り返し実行される部分はコンパイルされてコードキャッシュに保存される。(JITコンパイル)
すぐにコンパイルされない理由
javaでは繰り返し実行するコードがコンパイルされていると全体のパフォーマンスはよくなる。
1回しか実行されないコードはコンパイルするとパフォーマンスが悪くなるのでコンパイルされず、インタプリタ実行されるのみ。(1回実行の場合、コンパイル + 生成バイナリ実行」よりも、インタプリタ使った実行の方が早いため。)
繰り返し実行されて初めてコンパイルのメリットが活きてくる。
また、実行の特徴からコンパイル時の最適化を調整するので、しばらく実行して十分情報が得られてからコンパイルするほうが実行効率のよい結果が得られる。
コンパイラの種類
クライアントコンパイラとサーバーコンパイラがある。
どの程度コンパイルを積極的に行うかに違いがある。
クライアントのほうが積極的に行い、はやくパフォーマンスをあげようとする。
サーバーの方がより時間をおいて情報を得てからコンパイルを行い、最終的なパフォーマンスをあげようとする。
階層的コンパイラというものもある。
初期はクライアントコンパイラの動きをし、後半ある時点からサーバーコンパイラの挙動でコンパイルし直す。
主にはこれを使うのが良さげ。
コードキャッシュ
JVMがコードをコンパイルすると、コードキャッシュという領域に格納される。
サイズがいっぱいになるとそれ以上コードをコンパイルできなくなる
コンパイルの敷居値
コードがコンパイルされるまでのしきい値は調整することができる。
コンパイルの状況を見る
PrintCompilationフラグ設定を行うことで、実行時にどのようにコードがコンパイルされたかをログに出力するようにできる