2011-08-17 15 views
31

Javaプロファイリングでは、現在、すべての(フリー)道路がJDK6に含まれているVisualVMプロファイラにつながっているようです。それは素晴らしいプログラムのように見え、誰もが "実行中のプロセスにそれを付ける"方法を主な特徴として指摘しています。問題は、ローカルプロセスでを使用する唯一の方法はと思われます。 私のプログラムをプロファイラで開始し、その実行全体をに追跡できるようにしたい。プロファイルVisualVMでのJavaプログラムの実行

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

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

+0

あなたが言いました質問で、投稿された 'suspend = n'の代わりに' suspend = y'を試しましたか?もしそうなら 'System.in'から読み込む必要はありません。 –

+0

はい、問題はありません。 'suspend'パラメータに関係なく、VisualVMにプログラムを接続する方法はありません。 – kbolino

+0

どこかに「適切に」あるはずです。もちろん、VisualVMはプロセスを見ることができます。問題は、それがプロファイルできないということです。 – kbolino

答えて

19

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仮想マシンで報告することもできます。

+0

ありがとう、それは私が探していたものです! – kbolino

+0

いつでも、喜んで助けてください。 –

11

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

アプリケーションを変更して、VisualVMでプロファイラを設定している間にアプリケーションを一時停止することができれば、VisualVM Eclipseプラグインを使用してプロファイラを停止することは可能です。なぜ私のワークステーションで動作するように見えるので、あなたはNullPointerExceptionを取得しているのか分かりません。 jvisualvmバイナリへのパスとJDKのパスを指定してプラグインを設定する必要があります。これは、Windows - > Preferences - > Run/Debug - > Launching - > VisualVM ConfigurationのVisualVM設定ダイアログ(下記のスクリーンショット参照)を参照することで行います。

Eclipse VisualVM plugin

また、代わりにデフォルトのJDTのランチャーで、VisualVMのランチャーで起動するアプリケーションを設定する必要があります。

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

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

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

+0

NPEのスタックトレースを私に渡すことさえできないので、どちらの問題か分かりません。いずれにせよ、私はより自動化されたソリューションを探していましたが、残念なことにVisualVMはそれほど上手くいかないようです。 – kbolino

+1

プラグインを正しく設定しないと、再現可能な 'NullPointerException'が発生します。私のシステムでは、「JDK Home」がセットされ、「VisualVM Executable」が空で、VisualVmランチャーを使用する実行コンフィギュレーションは失敗します。 –

3

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

3

これはVisualVMに対してstartup profiler pluginで可能です。

+1

スタートアッププロファイラは、VisualVM 1.3.6で動作し、VisualVM 1.8.0でロードできないことを示します。少なくとも現在のバージョンではこれは動作しません。 –

関連する問題