私は、計測器バイトコードのJavaエージェントを持っています。 Java 6でattach apisを使用して、ユーザーがJavaエージェントを使用してエージェントと計測器を動的にロードし、デインストラメントコードをロードできるようにしています。 Boot-Class-Pathマニフェスト属性を使用して、javagentクラスがブートクラスパスに含まれていることを確認して、ユーザがArrayListなどのクラスをインストルメントできるようにします。Javaagentクラスのアンロード
ただし、 ユーザがエージェントのバージョン1を動的に接続するとします。 それから私は彼にバージョン2を与えました。私のエージェントのバージョン1を添付して以来、彼のアプリケーションサーバーは決してシャットダウンしていないので、バージョン1のクラスはまだロードされています。
私のクライアントバージョン2のjavaagent、バージョン1がアンロードされるときに何らかの方法が必要です。
私は、自分のjavaagentのクラス用の顧客クラスローダーを作成し、クラスローダー参照をnullに設定する方法があることを知っています。 しかし、その場合、私はクラスローダーがブートクラスローダーの階層の下にあるので、ブートクラスパスのクラスをインストルメントすることができません。したがって、ArrayListのようなインストルメントクラスは私のユーザが使用できません。私のエージェントのクラスのメソッドは、ブートクラスのローダーはそれらを見ることができません。
ブートクラスパスの問題を解決して以前のエージェントのクラスをアンロードする方法はありますか?
JavaRebel(http://www.zeroturnaround.com/javarebel/)をご覧になることをお勧めします。これは、実行しようとしていることを商業的に実装したものです。それはあなたに何が可能か不可能であるかを示すかもしれません。 – skaffman