2011-05-25 8 views
10

私は、実行時にattach APIを使用してJVMTIエージェントをロードしています。エージェントがロードされているJVMを終了せずにプログラムが終了したときにJVMTIエージェントをアンロードしたいのですが、this documentationによれば、これをアタッチAPIから行う方法はありません。エージェントがJava APIまたはJVMTIエージェントのいずれかを使って強制的に自己をアンロードするようにする方法はありますか?実行時にJVMTIエージェントをアンロードしますか?

+0

これは適切な答えではなく、単なる示唆です。私はJNI(私はモジュールをアンロードしたい)と同様の問題を抱えています。私が見つけた最良の解決策は、次のような単純なことです。新しいJVMインスタンスを生成してモジュールで処理し、終了するのを待ってから、終了すると、モジュールは明らかにアンロードされます。私はあなたがしばらくの間苦労した後、これをやめるだろうと確信しています。 P – gd1

答えて

5

JVMTI spec saysアンロード(JVM終了なし)は可能ですが、プラットフォームに依存し、仕様範囲外です。

0

あなたがプログラム的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(); 

doc here

を参照してください。

あなたは、システムのプロパティ「のjavaを設定する必要があります.system.class.loader "をターゲットJVM用のカスタムクラスローダーの名前にします。

は、クラスがすでにそれをロードする前にロードされている場合は、常にチェックし、「Javaの組み込みクラスローダーをdoc here

を参照してください。 クラスをリロードすると、Javaの組み込みクラスローダーを使ってことは不可能である。 あなたがする必要がありますクラスを再ロードするには独自のClassLoaderサブクラスを実装してください。

ClassLoader.getSystemClassLoader()に親があるClassLoaderを実装する必要があります。

「でもクラスローダのカスタムサブクラスで、あなたは挑戦を持っている。 すべてのロードされたクラスをリンクする必要があります。 これは このメソッドは最終である。ClassLoader.resolve()メソッドを使用して行われるので、オーバーライドすることはできません resolve()メソッドは、指定されたClassLoaderインスタンスが同じクラスを2回リンクすることを許可しません。 したがって、クラスをリロードするたびに、ClassLoaderサブクラスの新しいインスタンスを使用する必要があります。 これはありません不可能ですが、クラスの再読み込みを設計する際に知っておく必要があります。

Dynamic Class Reloading

+0

これはネイティブコードであるJVMTIエージェントには役立ちません。 JVMから切り離しても、JVMTIエージェントはアンロードされません。 – Jared

+0

私はそれを言わない。コード例は、エージェントをロードする方法を示すためのものです。 JVMからエージェントをアンロードすることは、クラスをアンロードするのと同じ問題です。唯一の解決策は、独自のクラスローダーを使用することです。 – EricParis16

+0

添付文書を見ると、loadAgentLibraryとloadAgentPathを使用してネイティブコードのJVMTIエージェントをロードするときに、Javaで書かれたエージェントをロードするためにloadAgentが使用されることが明確に記載されています。 JVMTIエージェントはネイティブコードでありJavaクラスではないので、クラスローダーに関する議論は適用されません。 http://download.oracle.com/javase/6/docs/jdk/api/attach/spec/index.html – Jared

関連する問題