10

JVM(特にHotSpot VM)は、実行時に適用できる最適化の数が非常に多いことで有名です。

特定のコードを調べて、JVMが実際にそれに対して何をしたかを確認する方法はありますか?

4

4 に答える 4

6

問題の 1 つは、JVM が自由にコードを再生成できるため、呼び出しごとに「JVM が実際に行ったこと」が変化することです。

final例として、数日前にホットスポットが仮想メソッドと比較してメソッドで何をするかを調査しました。マイクロベンチマークから判断すると、私の結論は次のとおりです。

  • クライアント JVM: メソッドが有効な final場合(それをオーバーライドするロード済みクラスがない場合)、JVM は非仮想呼び出しを使用します。その後、このメソッドをオーバーライドするクラスをロードすると、JVM は JIT されたコードを変更して呼び出しを仮想化します。そのため、 as を宣言しfinalても重要な関連性はありません。

  • サーバー JVM: こちらfinalも関連性がないようです。何が起こっているように見えるかというと、ロードされたクラスに関係なく、JVMが初めて使用しているクラスに対して非仮想呼び出しを生成することです。その後、別のクラスのオブジェクトから呼び出しを行うと、JVM はすべての呼び出しにこれと同様のパッチを適用します (呼び出しのプロファイリングも行うため、取得できなかった場合に高速パスと低速パスを変更できます)。それは初めてです):

    if (ClassOfNonVirtualCall のオブジェクト インスタンス) {
        ClassOfNonVirtualCall.method への非仮想呼び出しを行う
    } そうしないと {
        object.method への仮想呼び出しを行う
    }

生成されたコードを見ることに本当に興味がある場合は、OpenJDK の DEBUG JVM で遊ぶことができます。

http://dlc.sun.com.edgesuite.net/jdk7/binaries/index.html

http://wikis.sun.com/display/HotSpotInternals/PrintAssembly

于 2010-09-08T15:16:44.730 に答える
4

これは非常にJVM固有であり、見ている特定のJVMで深刻な調査を行う必要がある可能性があります。

利用可能なHotSpotVMオプションは、http: //www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.htmlで確認できます。

于 2010-09-08T15:02:22.493 に答える
3

以下は非常に優れたリソースです。

http://wikis.sun.com/display/HotSpotInternals/Home

特に興味深いのは、「LogCompilation ツール」と「LogCompilation の概要」のリンクです (登録したばかりなので、直接リンクを投稿できません)。

于 2010-09-08T15:20:52.510 に答える
2

これは、 HotSpotの最適化に関する優れたページです。いくつかの最適化は、コンパイラーによって発行されたバイトコードを見るとわかります。その他の最適化は動的であり、実行時にのみ存在します。たとえば、HotSpotは、実行時にスタックを直接変更するスタック上の置換を実行できます。

于 2010-09-08T15:24:38.560 に答える