web-dev-qa-db-ja.com

Javaプロファイリング-アプリケーションのメソッド分析によってメソッドを取得するにはどうすればよいですか?

Javaアプリを実行したいのですが、特定のワークロードについて次のことを確認できます。

  • 特定の関数が呼び出された回数
  • 各関数呼び出しの相対的なコスト(つまり、それぞれの実行にかかる時間)

私は自分のアプリケーションのどこにボトルネックがあるかを広く知っていますが、それを絞り込むには、はるかにきめ細かいビューが必要です。

ありがとう

編集 jvisualvmはツールのように見えます-約30秒で問題を特定しました。メソッドプロファイルのコンテキストで「セルフタイム」が何を意味するのかを知る必要があります。ありがとう

29
MalcomTucker

SunのJava 6)で実行されているプログラムの最も簡単なアプローチは、jdkでjvisualvmプログラムを使用することです。特別な設定なしでアタッチしてプロファイルを作成できます。

最も簡単な方法は、-profを使用することです。例:Java -prof -jar yourjar.jar

これにより、プログラムの実行が終了した後、Java.profというファイルが出力されます。

HPROFドキュメントページ を参照してください

私のアプリケーションでは、次を使用します:-Xrunhprof:cpu = samples、thread = y、doe = y

これにより、特に次の内容を含むレポートが印刷されます。

CPU SAMPLES BEGIN (total = 55110) Sun Feb  7 17:02:51 2010
rank   self   accum   count  trace  method
1      69.68% 69.68%   38399 300361 Java.net.SocketInputStream.socketRead0
2      24.40% 94.08%   13448 300386 Java.net.SocketInputStream.socketRead0
3      0.20%  94.28%     108 300425 Java.io.FileOutputStream.writeBytes
4      0.19%  94.47%     107 300976 Java.net.PlainDatagramSocketImpl.receive0
5      0.19%  94.65%     102 300414 package.BlockingSampleBuffer.addSample
6      0.16%  94.82%      90 300365 Java.net.SocketOutputStream.socketWrite0
7      0.16%  94.98%      89 300412 package.BlockingSampleBuffer.addSample
8      0.15%  95.13%      84 300430 Java.lang.Object.wait
9      0.14%  95.27%      77 300592 Java.io.FileOutputStream.writeBytes
10     0.14%  95.41%      76 300566 Java.lang.AbstractStringBuilder.<init>

したがって、さまざまな方法で費やされた合計時間(秒単位)を確認できます。私の場合、アプリはほとんどの時間をリモートホストからのデータの待機に費やしています(インターネット接続を介した場合はほとんどありません)。

13
gubby

いくつかのプロファイラーがリストされています(EclipseのものとJProfiler)。プロファイラーはプログラミングツールチェストのツールの1つであることを強くお勧めします。

これはほとんどのプログラマーが受け継ぐものですが、プロファイラーは、他の方法では解決するのが非常に難しい問題のクラス全体を解決できます。

プロファイラーを使用したことがない場合は、プロファイラーを見つけてダウンロードし、実行することを(質問者だけでなく、すべての人に)言っています。

ちなみに、これらはJavaツールの静的出力よりもはるかに強力ですが、この特定のケースではJavaツールで十分かもしれません。プロファイラーは、各スレッドが何をしているのかを教えてくれ、あなたが書かなかったコードを分析するのに役立つかなりクールな呼び出しグラフィック(フロー図スタイル)を作成できます。

1つを見つけて、それが何を提供するかを知るために1、2週間使用してください。

4
Bill K

Java 1.7 *にはJava Mission Control(jmc)がバンドルされており、メソッド実行のプロファイリングに使用できる「フライトレコーダー」機能があります。プロファイリング結果はAppDynamicsとほぼ同じように表示されます。パフォーマンスの問題を見つけます(特に、どのメソッドがすべてのCPUを使い果たしているか)。

詳細ではありませんが、Flight Recorderについて説明している優れたブログ投稿: http://hirt.se/blog/?p=364

*マイナーバージョンについてはわかりません

4
manikanta

あなたが少しのお金を使う気があるなら、

JProfiler: http://www.ej-technologies.com/products/jprofiler/overview.html

非常に優れており、使用時間の割合、絶対使用時間、およびメソッドレベルまでの呼び出し数が表示されます。 EJB呼び出し、Webサービス呼び出しを理解し、jdbc呼び出しのSQLも表示します。パフォーマンスの問題を見つけるために頻繁に使用します。

メモリプロファイリングもありますが、CPUプロファイリングの方がはるかに便利です。

2
karoberts

Eclipse TPTP を見てください。それらは、Eclipseから開始されたすべてのアプリケーションに、まさにそれ以上のものを提供できます。

2
Thomas Lötzer

まさにこれがAOPが役立つところです。コードを変更せずにアスペクトを追加/削除できます。 Springを使用している場合; JoinPoint、実行時間を評価するクラスとパブリックメソッドを一覧表示するアドバイスを含むアスペクトを作成します。これらのBeanをSpring構成に追加します。それ以外の場合は、Spring以外のアプリケーションにAspectJコンテナを使用します

1
Hussain