2013-04-28 12 views
6

JVMのJITs のことがよく聞きますが、プログラムの実行中にJITが実際に行っていることをプロファイルする方法については、多くの情報がありません。 -XX:+PrintCompilation-XX:+PrintOptoAssemblyの使用に関する多くのヒントがありますが、解釈が難しい本当に低レベルの情報になります。JVMの診断ツールと最適化のヒント

一般に、最適化の際には、専用のJITウォームアップ時間などを使用して一般的な操作のベンチマークスイートを用意したいと思いますが、コードで実際に最適化されている最適化を確認できます。おそらく私のJVMは特定のメソッド呼び出しをインライン展開すると考えていたかもしれませんが、何かを決めるのではなく、おそらくJITは自分のインバリアントとループ条件をあいまいに表現していたため、私はYourKitのようなツールが "JITで何が起こっているか"をサポートすると期待していますが、YourKitや他の場所でそのサポートを見つけることができませんでした。

理想的には、プログラムの実行中にJITのオプティマイザが思考している脳のダンプが好きです。私は自分の関数を十分に暖かくして、内部ループに3つのメソッドをインライン化し、ループを3つのセクションに分割することにしました。中間セクションの配列境界チェックはありません。これらの決定の要点と動機彼らのために。

私はここで何かが分かりませんか?何が起きているのかを把握するために内部ループを最適化するとき、JVMのパフォーマンスを意識したプログラマは何をしますか?確かに、低レベルの-XXフラグは唯一のオプションではありませんか?私は、JVM上のこのような低レベルのものにどう対処するのが良いかについてのヒントを感謝します。そして、いいえ、この質問は、時期尚早の最適化によって動機付けされていません! :)

編集:私が欲しいもののいくつかは-XX:+LogCompilationによって与えられていると思いますが、人々がこの種の活動のための一般的なヒントとツールを持っているかどうかはまだ不思議です。

+0

この話は、JVMの内部を視覚化する方法に関するいくつかの情報を提供します。http://www.infoq.com/presentations/Visualizing-Java-GC – sschaef

答えて

3

脳のダンプが必要な場合は、結果のアセンブリコードを印刷することができますが、よりも低いレベルです。あなたが探しているものがHotSpot JVMのために存在しないと思われます。 JRockitをベースにしたこのようなプレゼンテーションを見ましたが、これはいつかHotSpotに入ります。

私はここで何かが分かりませんか?何が起きているのかを把握するために内部ループを最適化するとき、JVMのパフォーマンスを意識したプログラマは何をしますか?

通常、私はごみの生産を最小限に抑えたいと考えています。これは通常、十分に機能します。例えばマイクロ秒の待ち時間である。

このようなマイクロ最適化には、実際にはマシンコードとCPUの実際の動作を深く理解する必要があります。

確かに、低レベルの-XXフラグは唯一のオプションではありませんか?

単純な場合は、はるかに複雑です。マシンコードをダンプするには、JVMに付属していない追加のネイティブライブラリが必要です。 ;)

このような低レベルのものをJVM上でどのように処理するのが良いかについてのヒントはありがたいです。

これは避けることができますが、これは良いことだと私は信じています。マイクロ最適化が優れているため、まず高レベルの世話をする必要がありますマイクロベンチマークの場合はエンドシステムのレイテンシをすべて理解する必要があるため、実際のアプリケーションではほとんど役に立ちません。多くの場合、コードを見なくても実行できます。つまり、データベース、OS、ディスク、またはネットワークIOの主な遅延です。

この種のアクティビティの一般的なヒントとツールがあるのはまだ不思議です。

プロファイラーを使用して、低くする必要があると思われる場合は、はるかに重要なことを見逃している可能性があります。

+1

右側のライブラリを追加することは、実際には、ホットスポットでmachinecode 。 JVMのデバッグビルドの必要はなく、デフォルトのバイナリは正常に動作します。 – Voo

+0

@Voo私はこれをしてからしばらくしています。修正していただきありがとうございます。 –

+1

私はそれがもっと重要なことを必ず逃した可能性が高いとは思わない。私は主に、Scalaなどの高水準言語がJVMの既存の最適化とどのように関係しているかに興味があります。特に、Scalaからかなりのパフォーマンスを得るための唯一の方法(ユーザーフレンドリーな機能のための多数のクランチング、つまり生のスピードの問題など)がwhileループなどに落とされるというのは残念です。これを改善するために、私は実験したいが、それでもなおJITとうまく機能するScalaの抽象概念を設計し、それを行うには、良いJIT診断ツールが役立ちます。 –

関連する問題