2

私はJVMTIを使用してプロファイラーを作成しています。

C ++では、収集した情報をソケットに書き込む単純なエージェントを作成しました。Java Swingを使用して、ソケットからこれらのデータを読み取って視覚化する単純なGUIを構築しました。

しかし、私はいくつかのユーザビリティの問題に直面しています。リクエストに応じてJavaアプリケーションのプロファイリングを開始する機能を提供したいと思います。実行中のJVMにエージェントを注入する可能性を提供するAttachAPIがあります。

ただし、新しいJavaプログラムを起動してエージェントを注入するのは、もう少し複雑です。1つの方法は、コマンドラインを呼び出して、GUIプロファイラーからJavaプログラムを起動することです。

java -agentlib:agent Program

どういうわけかハッキーなので、私はこのアイデアが嫌いですが、他の方法はわかりませんね。

要約すると、JVMのプロファイリングを開始するには2つの方法が必要です。

  1. Javaアプリケーションを最初から開始し、直接プロファイリングを開始します
  2. 実行中のJVMに接続し、エージェントを注入してプロファイリングを開始します

さらに、検査するさまざまなJVMを区別する必要がありますが、それを行うにはどうすればよいですか?異なるJVMに一意の識別子はありません。Attach APIを使用すると、さまざまなJVMを名前IDで一覧表示できますが、最初のケースではどうすればよいでしょうか。エージェントに引数を挿入することは可能ですか?

4

2 に答える 2

2

Agent_OnLoadで独自のGUIDを生成し、それをログに使用することもできます。このようにして、プロセスの一部の寿命が短く、他のプロセスの寿命が長い場合は、リサイクルされたPIDSを区別できます。

于 2013-10-28T00:09:24.113 に答える
1

ローカルプロセスID(pid)とネットワークアドレスを使用してJVMを一意に識別することにより、問題を解決しました。

于 2011-08-01T19:42:56.623 に答える