バイトコードを計測する Java エージェントがあります。Java 6 でアタッチ API を使用して、ユーザーが Java エージェントを使用してエージェントとインスツルメントおよびインスツルメンテーション コードを動的にロードできるようにしています。Boot-Class-Path マニフェスト属性を使用して、javagent クラスがブート クラスパスにあることを確認し、ユーザーが ArrayList などのクラスを計測できるようにしています。
ただし、バージョン管理には問題があります。ユーザーがエージェントのバージョン 1 を動的にアタッチするとします。次に、彼にバージョン 2 を渡しました。彼が私のエージェントのバージョン 1 をアタッチして以来、彼のアプリケーション サーバーはシャットダウンされていないため、バージョン 1 のクラスがまだロードされています。
私のクライアント バージョン 2 の javaagent がバージョン 1 をアンロードするような方法が必要です。
javaagent のクラスの顧客クラスローダを作成し、クラスローダの参照を null に設定する方法があることはわかっています。ただし、その場合、クラスローダーはブートクラスローダーの階層の下にあるため、ブートクラスパスでクラスを計測することはできません。したがって、ユーザーは ArrayList のようなクラスを計測できません。エージェントのクラスのメソッドは、ブート クラス ローダーからは見えません。
ブート クラスパスの問題を解決し、以前のエージェントのクラスをアンロードする方法はありますか?