私はJVMTIを使用してプロファイラーを作成しています。
C ++では、収集した情報をソケットに書き込む単純なエージェントを作成しました。Java Swingを使用して、ソケットからこれらのデータを読み取って視覚化する単純なGUIを構築しました。
しかし、私はいくつかのユーザビリティの問題に直面しています。リクエストに応じてJavaアプリケーションのプロファイリングを開始する機能を提供したいと思います。実行中のJVMにエージェントを注入する可能性を提供するAttachAPIがあります。
ただし、新しいJavaプログラムを起動してエージェントを注入するのは、もう少し複雑です。1つの方法は、コマンドラインを呼び出して、GUIプロファイラーからJavaプログラムを起動することです。
java -agentlib:agent Program
どういうわけかハッキーなので、私はこのアイデアが嫌いですが、他の方法はわかりませんね。
要約すると、JVMのプロファイリングを開始するには2つの方法が必要です。
- Javaアプリケーションを最初から開始し、直接プロファイリングを開始します
- 実行中のJVMに接続し、エージェントを注入してプロファイリングを開始します
さらに、検査するさまざまなJVMを区別する必要がありますが、それを行うにはどうすればよいですか?異なるJVMに一意の識別子はありません。Attach APIを使用すると、さまざまなJVMを名前とIDで一覧表示できますが、最初のケースではどうすればよいでしょうか。エージェントに引数を挿入することは可能ですか?