私は、実行時にattach APIを使用してJVMTIエージェントをロードしています。エージェントがロードされているJVMを終了せずにプログラムが終了したときにJVMTIエージェントをアンロードしたいのですが、this documentationによれば、これをアタッチAPIから行う方法はありません。エージェントがJava APIまたはJVMTIエージェントのいずれかを使って強制的に自己をアンロードするようにする方法はありますか?実行時にJVMTIエージェントをアンロードしますか?
答えて
JVMTI spec saysアンロード(JVM終了なし)は可能ですが、プラットフォームに依存し、仕様範囲外です。
あなたがプログラム的JVMTIエージェントをロードする必要があります:あなたがデフォルト以外のクラスロードを使用する必要がその後
// attach to target VM
VirtualMachine vm = VirtualMachine.attach("2177");
// get system properties in target VM
Properties props = vm.getSystemProperties();
// construct path to management agent
String home = props.getProperty("java.home");
String agent = home + File.separator + "lib" + File.separator
+ "your-agent-example.jar";
// load agent into target VM
vm.loadAgent(agent, "com.sun.management.jmxremote.port=5000");
// detach
vm.detach();
を参照してください。
あなたは、システムのプロパティ「のjavaを設定する必要があります.system.class.loader "をターゲットJVM用のカスタムクラスローダーの名前にします。
は、クラスがすでにそれをロードする前にロードされている場合は、常にチェックし、「Javaの組み込みクラスローダーをdoc here
を参照してください。 クラスをリロードすると、Javaの組み込みクラスローダーを使ってことは不可能である。 あなたがする必要がありますクラスを再ロードするには独自のClassLoaderサブクラスを実装してください。
ClassLoader.getSystemClassLoader()に親があるClassLoaderを実装する必要があります。
「でもクラスローダのカスタムサブクラスで、あなたは挑戦を持っている。 すべてのロードされたクラスをリンクする必要があります。 これは このメソッドは最終である。ClassLoader.resolve()メソッドを使用して行われるので、オーバーライドすることはできません resolve()メソッドは、指定されたClassLoaderインスタンスが同じクラスを2回リンクすることを許可しません。 したがって、クラスをリロードするたびに、ClassLoaderサブクラスの新しいインスタンスを使用する必要があります。 これはありません不可能ですが、クラスの再読み込みを設計する際に知っておく必要があります。
これはネイティブコードであるJVMTIエージェントには役立ちません。 JVMから切り離しても、JVMTIエージェントはアンロードされません。 – Jared
私はそれを言わない。コード例は、エージェントをロードする方法を示すためのものです。 JVMからエージェントをアンロードすることは、クラスをアンロードするのと同じ問題です。唯一の解決策は、独自のクラスローダーを使用することです。 – EricParis16
添付文書を見ると、loadAgentLibraryとloadAgentPathを使用してネイティブコードのJVMTIエージェントをロードするときに、Javaで書かれたエージェントをロードするためにloadAgentが使用されることが明確に記載されています。 JVMTIエージェントはネイティブコードでありJavaクラスではないので、クラスローダーに関する議論は適用されません。 http://download.oracle.com/javase/6/docs/jdk/api/attach/spec/index.html – Jared
- 1. DLLのアンロード/クローズ時にアクションを実行
- 2. TeamCityエージェントのエラー "エージェントでのチェックアウトの実行に失敗しました"
- 3. g ++でjvmtiエージェントをコンパイルしても動作しませんが、ccは正常に動作します
- 4. Notesデザイナーは保存後にエージェントを実行します
- 5. NSUserDefaultsは実行時に常にIOを実行しますか?
- 6. fで長時間実行されているエージェント#
- 7. 複数のマシンでF#エージェントを実行できますか?
- 8. JVMTIによる測定方法の実行
- 9. マップF#エージェントでReduceを実行
- 10. 複数のTeamCityエージェントを同じコンピュータで実行していますか?
- 11. バイトコード計測 - ネイティブまたはJavaエージェントを実装しますか?
- 12. エージェント経由でSSISを実行中にプロキシアカウントが失敗しました
- 13. SSISパッケージを実行するとSQLエージェントが動作しない
- 14. アンロード時にAJAXが動作しない
- 15. 実行時に.NETでスワップメソッドの実装を行いますか?
- 16. はJVMTI
- 17. ディレクティブ/命令は、実行時またはアセンブリ時に実行されますか?
- 18. onclickを追加したり、実行時にデータベースから実行時に作成
- 19. スタブ宣言ではなく、実行時にrspecスタブを実行しますか?
- 20. 実行時にInfo.plistを変更して「アプリケーションがエージェント(UIElement)」に設定されている場合
- 21. アンロード機能でAJAX呼び出しを実行
- 22. ファイルシステムからSQL Serverエージェント経由で.sqlファイルを実行
- 23. 実行時にメソッド名をBean名に変換しますか?
- 24. 実行時にDataGridViewにDataFormatStringを設定しますか?
- 25. 実行時にRazor Viewsを動的に生成しますか?
- 26. SQL Serverエージェントが実行されていません
- 27. INRIAは同時実行プリミティブをOCamlに追加しますか?
- 28. iPhoneは実行時にSQLiteデータベースを作成しますか?
- 29. 実行時にSCSSをコンパイルしますか?
- 30. 同時に2つのループを実行していますか?
これは適切な答えではなく、単なる示唆です。私はJNI(私はモジュールをアンロードしたい)と同様の問題を抱えています。私が見つけた最良の解決策は、次のような単純なことです。新しいJVMインスタンスを生成してモジュールで処理し、終了するのを待ってから、終了すると、モジュールは明らかにアンロードされます。私はあなたがしばらくの間苦労した後、これをやめるだろうと確信しています。 P – gd1