33

Java プロファイリングでは、最近ではすべての (無料の) 道が JDK6 に含まれる VisualVM プロファイラーにつながっているようです。それは素晴らしいプログラムのように見え、誰もが「実行中のプロセスにアタッチする」ことができることを主な機能として宣伝しています。問題は、それがローカル プロセスで使用する唯一の方法であるように思われることです。プロファイラーでプログラムを開始し、その実行全体を追跡できるようにしたいと考えています。

how to profile application startup with visualvm-Xrunjdwpで説明されているオプションを使用してみましたが、2 つの転送方法 (共有メモリとサーバー) の間では、どちらも役に立ちません。VisualVM は前者との統合がないようで、VisualVM はまたはへの接続を拒否するため、後者もダメです。また、プログラムに単純な読み取りを挿入して実行の一時停止を挿入しようとしましたが、その場合、VisualVM は読み取りが完了するまでブロックし、実行が開始されるまでプロファイリングを開始できません。 Eclipseプラグインも調べてみましたが、Webサイトにはリンク切れが多く、使用しようとするとランチャーがクラッシュするだけですlocalhost127.0.0.1System.inNullPointerException(これはもはや正確ではないかもしれません)。

C 出身の私にとって、これは特に難しい作業ではないように思えます。何か足りないだけですか、それとも本当に不可能なリクエストですか? 別の (これも無料の) プロファイラーを使用するなど、あらゆる種類の提案を受け入れます。また、コマンド ラインも嫌いではありません。

4

4 に答える 4

20

HPROFを使用し、HPjmeterなどのツールでデータ ファイルを開くか、お気に入りのエディターで結果のテキスト ファイルを読み取ることを検討してください。

Command used: javac -J-agentlib:hprof=heap=sites Hello.java

SITES BEGIN (ordered by live bytes) Fri Oct 22 11:52:24 2004
          percent          live          alloc'ed  stack class  rank   self  accum     bytes objs     bytes  objs trace name
    1 44.73% 44.73%   1161280 14516  1161280 14516 302032 java.util.zip.ZipEntry
    2  8.95% 53.67%    232256 14516   232256 14516 302033 com.sun.tools.javac.util.List
    3  5.06% 58.74%    131504    2    131504     2 301029 com.sun.tools.javac.util.Name[]
    4  5.05% 63.79%    131088    1    131088     1 301030 byte[]
    5  5.05% 68.84%    131072    1    131072     1 301710 byte[]

HPROF は、CPU 使用率、ヒープ割り当て統計を表示し、競合プロファイルを監視することができます。さらに、Java 仮想マシン内のすべてのモニターとスレッドの完全なヒープ ダンプと状態をレポートすることもできます。

于 2011-08-17T21:02:02.853 に答える
11

アプリケーションを変更せずにこの問題を解決する最善の方法は、VisualVM をまったく使用しないことです。他の無料のオプションに関する限り、Eclipse TPTPまたはNetbeans プロファイラー、または IDE に付属するものを使用できます。

アプリケーションを変更して、VisualVM でプロファイラーをセットアップしている間、アプリケーションの状態を一時停止することができる場合、VisualVM Eclipse プラグインを使用してそれを行うことは十分に可能です。私のワークステーションで動作しているように見えるので、NullPointerException が発生する理由がわかりません。jvisualvmバイナリへのパスと JDK のパスを指定して、プラグインを構成する必要があります。これを行うには、[Windows] -> [設定] -> [実行/デバッグ] -> [起動] -> [VisualVM 構成] の VisualVM 構成ダイアログにアクセスします (下のスクリーンショットを参照)。

Eclipse VisualVM プラグイン

また、デフォルトの JDT ランチャーではなく、VisualVM ランチャーで起動するようにアプリケーションを構成する必要があります。

VisualVM がすでに実行されている場合、Eclipse からすべてのアプリケーションを起動すると、VisualVM は新しいローカル JVM を自動的に追跡します。VisualVM を実行していない場合、プラグインは VisualVM を起動しますが、アプリケーションの実行も継続します。

前の文から推測すると、main()何らかの処理を実行する前にアプリケーションをメソッド内で停止させることが非常に有用であることは明らかです。しかし、それはアプリケーションを一時停止する主な理由ではありません。どうやら、VisualVM またはその Eclipse プラグインでは、CPU またはメモリ プロファイラーの自動起動が許可されていません。これは、これらのプロファイラーを手動で開始する必要があることを意味し、その結果、アプリケーションを一時停止する必要が生じます。

さらに、flags: を JVM スタートアップに追加して-Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=yも、VisualVM の場合、アプリケーションを一時停止してプロファイラーをセットアップするのに役立ちません。フラグは、JDWP プロトコルを使用して JVM の開いているポートに実際に接続できるプロファイラーの場合に役立ちます。VisualVM はこのプロトコルを使用しないため、JDB またはリモート デバッガーを使用してアプリケーションに接続する必要があります。VisualVM (少なくとも Java 6 update 26 以降) では、プロファイラー タブが表示されないため、中断されたプロセスでプロファイラーを構成することはできません。

于 2011-08-17T20:34:13.277 に答える
4

これは、VisualVMのスタートアップ プロファイラー プラグインで可能になりました。

于 2014-02-24T14:37:03.130 に答える
3

のアドバイス-Xrunjdwpは間違っています。デバッガーを有効にするだけでsuspend=y、デバッガーがアタッチされるのを待ちます。VisualVM はデバッガーではないため、役に立ちません。System.inただし、またはを挿入するThread.sleep()と、起動が一時停止し、VisualVM がアプリケーションに接続できるようになります。プロファイラーの設定をよりよく理解するために、VisualVM 1でのプロファイリングと VisualVM 2でのプロファイリングを必ずお読みください。プロファイリングの代わりに、VisualVM の「Sampler」タブを使用できることにも注意してください。これは、 Java プログラム実行全体のプロファイリングにより適しています。他の人が述べたように、アプリケーション起動のプロファイリングを直接サポートする NetBeans プロファイラーも使用できます。

于 2011-08-18T07:04:22.303 に答える