web-dev-qa-db-ja.com

プロファイル全体Java VisualVMでのプログラム実行

Javaプロファイリングでは、最近のすべての(無料)道路がJDK6に含まれているVisualVMプロファイラに通じているようです。これは見事なプログラムのように見えます。プロセス」を主要な機能として使用します。問題は、ローカルプロセスでそれを使用する唯一の方法のように思われることです。 startプロファイラでプログラムを実行し、その実行全体を追跡します

visualvmを使用してアプリケーションの起動をプロファイルする方法 で説明されている-Xrunjdwpオプションを使用してみましたが、2つの転送方法(共有メモリとサーバー)の間ではどちらも役に立ちません。 VisualVMは前者と統合されていないようで、VisualVMはlocalhostまたは127.0.0.1への接続を拒否しているため、後者も適切ではありません。また、プログラムにSystem.inの単純な読み取りを挿入して実行の一時停止を挿入しようとしましたが、その場合、VisualVMは読み取りが完了するまでブロックし、実行が完了するまでプロファイリングを開始できません。 私も調べてみました Eclipseプラグイン ですが、ウェブサイトにはデッドリンクがたくさんあり、ランチャーは使用しようとするとNullPointerExceptionでクラッシュします (これはもはや正確ではないかもしれません)。

Cから来た私にとって、これは特に難しい作業のようには思えません。私は何かを逃しているだけですか、これは本当に不可能な要求ですか?私は、さまざまな(無料の)プロファイラーの使用を含め、あらゆる種類の提案を受け入れています。また、コマンドラインを嫌いではありません。

32
kbolino

[〜#〜] 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仮想マシン内のすべてのモニターとスレッドの完全なヒープダンプと状態を報告することもできます。

20
Amir Afghani

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

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

Eclipse VisualVM plugin

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

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

前の文から推測できるように、処理を実行する前にmain()メソッドでアプリケーションを停止させると非常に便利です。しかし、それがアプリケーションを一時停止する主な理由ではありません。どうやら、VisualVMまたはそのEclipseプラグインでは、CPUまたはメモリプロファイラーを自動的に起動できません。これは、これらのプロファイラーを手動で開始する必要があるため、アプリケーションを中断する必要があることを意味します。

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

11
Vineet Reynolds

スタートアッププロファイラプラグイン を使用して、これをVisualVMで実行できるようになりました。

4

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

3
Tomas Hurka