iku8blog

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

【Javaパフォーマンス】JITコンパイラのclientとseverと階層型について

f:id:iku8:20210127000104j:plain

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

普段FWに則ってアプリケーションのコードを記述しているだけだと、JITコンパイラの動きなんて意識しないので、 コンパイラの種類など興味深い内容だった。

JVMJITコンパイラについて

JVMJITコンパイラにおけるコンパイラの種類は3つある

  1. clientコンパイラ
  2. serverコンパイラ
  3. 階層型コンパイラ

これらはJITコンパイラはどのタイミングでコンパイルを行うかの設定になる 1と2はトレードオフの関係にあるが、それらをうまく組み合わせたのが3で、現在は3がデフォルトになっている 特に理由がなければ3の階層型コンパイラを使うことになるはず

clientコンパイラ

これは早期にコンパイルを行うコンパイラであり、 アプリケーションの初速を重要視したいのであれば、このclinetを使うと良い

デメリットとしては、初めから何でもかんでもコンパイルするので、最適化されたコンパイルが出来ているとは到底言えない

serverコンパイラ

コンパイルを早期に行わず、しばらくインタプリタによるコードの実行を行う その後、コンパイルすべきコードを探し出し、最適な形でコンパイルを行う

clientコンパイラに比べて、コードの動作状況を確認しながらコンパイルを行うため、最適なコンパイルが可能になる ただしclientに比べると、初速が遅くなってしまうので、その点はデメリット

階層型コンパイラ

clientコンパイラは初速は速いが、賢くない最適化が行われるデメリットがあり、 serverコンパイラは賢い最適化は行われるもの初速が遅いデメリットがある。

これら2つのデメリットを補うのが階層型コンパイラ

アプリケーション起動後すぐはclientコンパイラのように、出来るだけ多くのコンパイル操作を行い(まだ賢い最適化ではない)、 アプリケーションの実行状況を見ながら最適なコンパイルを逐次行っていく

Java7の頃より階層化コンパイラは試験的に取り入れられ、Java8以降はデフォルトとして階層化コンパイラが設定されている。

参考

Java のJIT コンパイルについて - それが僕には楽しかったんです。