2013-02-22 14 views
25

私のアプリが起動すると、頻繁に呼び出されるパフォーマンスクリティカルなメソッドがあります。最終的には、JITコンパイルされますが、インタープリタで実行されている時間の後ではありません。JVMに強制的にネイティブ・メソッドをコンパイルできますか?

このメソッドを最初からコンパイルしたいと言う方法はありますか?(-XX:CompileThresholdのようなもので他の内部構造を調整する必要はありません)

+0

あなたは、その方法の現実的な合成ウォームアップを実行できますか、それとも偽造することはできませんか? – Matt

+1

このメソッドは、起動直後に大きな構成ファイルを解析するために使用されます。これがスピードアップしたいものです。人工的なウォーミングアップはおそらくこの時点ではうまくいかないでしょう... –

+0

おそらく設定を簡略化できますか?それをxmlからより単純なプロパティー形式に変更するか、それを読むために必要なコード量を減らすために何かを変更しますか?おそらく起動するだけの小さな「ブート」部分とバックグラウンドでロードできる主要部分に設定を分割することができますか?多分コードを解釈しても、スレッドを高速化するかもしれませんが、作業を並列化してください。 – radai

答えて

32

私が知っている唯一の方法は、-Xcompフラグですが、それは一般的にはお勧めできません。すべてのクラスとメソッドのJITコンパイルを強制的に実行します。欠点は、(JITアクティビティが増加したため)最初の起動時にパフォーマンスが低下することです。このフラグの他の主な制限は、JITが通常行う増分プロファイリングベースの最適化を無効にするように見えることです。標準の混合モードでは、JITコンパイラは、収集されたプロファイリングとランタイム情報に基づいて、コードの一部を継続的に最適化および再コンパイルすることができます。これにより、省略されたが必要であることが判明した境界チェックなどの欠陥のある最適化を「修正」することができます。-Xcompは、プロファイリングベースの最適化を無効にし、プログラムによっては、起動時に実際の利得がないため、使用することをお勧めしません。 -Xcomp(かなり残酷である)と-XX:CompileThresholdに超えて

(JITがそれを最適化/コンパイルする前に統計情報を収集するためにintepretedモードで実行されますどのように多くの指定されたメソッドの実行を制御する)、-Xbatchもあります。これは、JITコンパイルを強制的に "フォアグラウンド"にします。通常は、バックグラウンドでコンパイルするのではなく、コンパイルされるまでメソッド呼び出しをブロックします。

使用しているJavaのバージョンは指定していませんが、Java 7がオプションの場合は、「Tiered compilation」(-XX:+TieredCompilationスイッチでアクティブ化)という新しいJITモデルが導入されています。コンパイルが階層化されているのは、メソッドの最初の使用時に最初の小さなコンパイル・パスを可能にし、収集されたプロファイリング・データに基づいて、後でさらに大きなコンパイル/最適化を行うことができるということです。それはあなたにとって興味深いはずです。

これはおそらくいくつかの調整とパラメータ/設定が必要ですが、それ以上調べることはありません。

+0

これらのオプションの素晴らしいリストをありがとう。あまりにも細かいレベルで設定することはできません... –

+0

私はTieredCompilationは実際には長期的には何も変更されないので、あまりにも多くのダメージを与えるとは思わない – radai

2

コードが完全にプリコンパイルされているかどうかはわかりませんが、クリティカルメソッドを含むクラスをJVMの共有データダンプに追加できます。詳細はthis questionを参照してください。

また、あなたはJNIを考慮しましたか?あなたのメソッドがCPUを大量に使用している場合は、処理が大幅に高速化する可能性があります。

+0

興味深い。これは、クラスの読み込みを向上させるだけで、JITコンパイラには触れないようです。または私は何かを逃している?私はJNIを避けたいと思っています。私たちが配備するすべてのプラットフォームでネイティブコードをコンパイルする必要があります。 –

関連する問題