アプリの起動時に頻繁に呼び出されるパフォーマンス クリティカルなメソッドがあります。最終的に、JIT コンパイルされますが、インタープリターで実行された後ではありません。
このメソッドを最初からコンパイルしたいことをJVMに伝える方法はありますか(他の内部を次のようなもので調整する必要はありません-XX:CompileThreshold
)?
アプリの起動時に頻繁に呼び出されるパフォーマンス クリティカルなメソッドがあります。最終的に、JIT コンパイルされますが、インタープリターで実行された後ではありません。
このメソッドを最初からコンパイルしたいことをJVMに伝える方法はありますか(他の内部を次のようなもので調整する必要はありません-XX:CompileThreshold
)?
私が知っている唯一の方法は-Xcomp
フラグですが、一般的に使用することはお勧めできません。すべてのクラスとメソッドが最初に実行されるときに、それらの即時 JIT コンパイルを強制します。欠点は、最初の起動時にパフォーマンスが低下することです (JIT アクティビティが増加するため)。このフラグのもう 1 つの主な制限は、JIT が通常行う増分プロファイリング ベースの最適化を無効にしているように見えることです。標準の混合モードでは、JIT コンパイラーは、収集されたプロファイリングおよびランタイム情報に基づいて、コードの一部を継続的に最適化解除および再コンパイルできます (また、そうします)。これにより、省略されたが必要であることが判明した境界チェック、最適化されていないインライン化など、誤った最適化を「修正」できます。-Xcomp
プロファイリングベースの最適化を無効にし、プログラムによっては、全体的なパフォーマンスが大幅に低下する可能性がありますが、起動時にわずかな利益しか得られないか、まったく得られないため、使用することはお勧めしません.
-Xcomp
(これは非常に残忍です) と(-XX:CompileThreshold
特定のメソッドをコンパイル/最適化する前に統計を収集するために JIT が解釈モードで実行するメソッドの実行回数を制御します) 以外にも、-Xbatch
. これにより、JIT コンパイルが「フォアグラウンド」に強制され、通常のようにバックグラウンドでコンパイルされるのではなく、コンパイルされるまでメソッドの呼び出しが本質的にブロックされます。
使用している Java のバージョンは指定しませんでしたが、Java 7 がオプションである場合は、「階層化コンパイル」(-XX:+TieredCompilation
スイッチでアクティブ化) と呼ばれる新しい JIT モデルが導入されます。階層化されたコンパイルが行うことは、収集されたプロファイリング データに基づいて、メソッドの最初の使用時に最初の小さなコンパイル パスを許可し、後で追加の大規模なコンパイル/最適化を許可することです。それはあなたにとって興味深いはずです。
追加の微調整とパラメーター/構成が必要になると思われますが、それ以上チェックすることはできません。
コードが完全にプリコンパイルされるかどうかはわかりませんが、クリティカル メソッドを使用してクラスを JVM の共有データ ダンプに追加することはできます。詳細については、この質問を参照してください。
また、JNIを検討しましたか?メソッドが非常に CPU を集中的に使用する場合、処理が大幅に高速化される可能性があります。