web-dev-qa-db-ja.com

Javaアプリケーションプロファイリング

アプリケーション(バックエンドで実行されるサービス)をプロダクションでプロファイルするために使用できるJavaコードプロファイラーを探しています(つまり、オーバーヘッドが低く、アプリケーションの速度が低下してはなりません)。主にツリープロファイリングを呼び出します。つまり、a()がb()を呼び出し、次にb()がc()を呼び出した場合、その時間はa() b()とc()は、包括的かつ排他的に取得しました。

jvisualvmjprofilerを見てきましたが、これは私が探しているものではありません。これは、本番アプリケーションをそれらに結び付けることができないためです。これは、大きなパフォーマンスの問題を引き起こすからです。

また、metricshttps://github.com/dropwizard/metrics )を実行しましたが、呼び出しツリーのプロファイルを作成する機能がありません。

Callgrindhttp://valgrind.org/docs/manual/cl-manual.html )タイプライブラリは、呼び出しツリーのプロファイリング機能や次のような高度なオプションを提供するため、私が必要とするものです呼び出しサイクルの回避(再帰)。しかし、プログラムが終了するとCallgrindがデータをダンプするため、実稼働環境でCallgrindを使用できるかどうかはわかりません。

パフォーマンスを犠牲にすることなく本番環境で使用できるJavaの優れた呼び出しツリープロファイラーを提案できますか?

17
Arry

Java Mission ControlFlight Recorder と組み合わせて見てください。 Oracle JDK 7 Update 40(7u40)のリリース以降、Java Mission ControlはHotSpot JVMにバンドルされているため、高度に統合されており、ランタイムパフォーマンスへの影響が小さいとされています。私はそれを見始めたばかりで、いくつかの呼び出しツリー機能が見えます。

enter image description here

13
kc2001

一般に、アプリケーションを計測するプロファイラーはありません(またはお勧めしません)。計装は常に、制御できない生産オーバーヘッドを意味します。

使用できるのは、サンプリングプロファイラーです。サンプリングプロファイラーは、制御可能な間隔でスタックトレースのスナップショットを作成します。取得できないのはコールカウントですが、実行後、ホットスポットがある場所の概要がわかります。プロファイラーのサンプル間隔を調整できるので、プロファイラーのオーバーヘッドに影響を与えることができます。

使用可能なサンプリングプロファイラーはJDKに同梱されています。Java 7ドキュメントの hprofページ を参照してください。以前は、(ヒープトレースではなく)hprof cpuトレース用のグラフィカル分析ツールがいくつか存在していました。今、彼らはなくなっています。ただし、生成されたテキストファイルを既に使用することができます。

上記のJava Mission Controlについて簡単に調べました。これは非常に強力で、多くのニーズを満たすと思います。ホワイトペーパーでは、オーバーヘッドは2%しかないと述べています。しかし、それは私が個人的に必要または望んでいるものではありません。私のアプリケーションでは、常に「ライト」プロファイリングを有効にすることをお勧めします。

10
cruftex

Intel Amplifier XE http://software.intel.com/en-us/intel-vtune-amplifier-xe 目立つ場合は、オーバーヘッドが低くなっています。スタックサンプリングテクノロジーを使用して影響を最小限に抑え、稼働中のノンストッププロセスの実行にアタッチおよびデタッチできます。プロファイリング中にソースを用意する必要はありません。オフラインでのパフォーマンス結果の参照後にソースに飛び込むことができます。

4
Andrew

パフォーマンスに影響を与えずにプロファイリングを実行できるツールは知りません。

関心のあるメソッドにロギングを追加できます。ログにタイムスタンプを含めてください。その後、タイミングを行うことができます。また、パフォーマンスの低下を減らすために、非同期にログを記録するようにログフレームワークを構成する必要があります。

AspectJ のような読み込み時間ウィーバーは、実行時にこれらの呼び出しを追加できます。これにより、常にソースコードを変更することなく、監視するメソッドを簡単に選択できます。

aroundアスペクトを使用すると、タイミングロギングを追加することもできるため、ログを解析して一致するログエントリを見つける必要はありません。 詳細については、このブログ投稿を参照してください

perfspytutorial )をご覧ください。必要な機能がすでに用意されている場合があります。

関連:

1
Aaron Digulla