2009-08-08 8 views
3

私は、計測器バイトコードのJavaエージェントを持っています。 Java 6でattach apisを使用して、ユーザーがJavaエージェントを使用してエージェントと計測器を動的にロードし、デインストラメントコードをロードできるようにしています。 Boot-Class-Pathマニフェスト属性を使用して、javagentクラスがブートクラスパスに含まれていることを確認して、ユーザがArrayListなどのクラスをインストルメントできるようにします。Javaagentクラスのアンロード

ただし、 ユーザがエージェントのバージョン1を動的に接続するとします。 それから私は彼にバージョン2を与えました。私のエージェントのバージョン1を添付して以来、彼のアプリケーションサーバーは決してシャットダウンしていないので、バージョン1のクラスはまだロードされています。

私のクライアントバージョン2のjavaagent、バージョン1がアンロードされるときに何らかの方法が必要です。

私は、自分のjavaagentのクラス用の顧客クラスローダーを作成し、クラスローダー参照をnullに設定する方法があることを知っています。 しかし、その場合、私はクラスローダーがブートクラスローダーの階層の下にあるので、ブートクラスパスのクラスをインストルメントすることができません。したがって、ArrayListのようなインストルメントクラスは私のユーザが使用できません。私のエージェントのクラスのメソッドは、ブートクラスのローダーはそれらを見ることができません。

ブートクラスパスの問題を解決して以前のエージェントのクラスをアンロードする方法はありますか?

+1

JavaRebel(http://www.zeroturnaround.com/javarebel/)をご覧になることをお勧めします。これは、実行しようとしていることを商業的に実装したものです。それはあなたに何が可能か不可能であるかを示すかもしれません。 – skaffman

答えて

1

私はこのトピックの専門家ではありませんが、この種のアンロードトゥー置換は直接サポートされていないようです。

しかし、クラスをアンロードする必要がありますか?

代わりに、バージョン管理システムを内部的に実装している外部の世界が話している、変わらないクラスを作成できますか?

たとえば、使用するToolAgentImplementationのクラス名を持つ静的な文字列を持つクラスMyToolAgentを作成します。最初にリリースすると、ToolAgentImplementation1_0を使用するように設定されます。バージョン2.0にアップグレードするときは、ToolAgentImplmenetation2_0という追加のクラスをデプロイし、MyToolAgentクラスを更新してロードして使用します。バージョン1.0をアンロードすることは決してありませんが、使用を中止します。あなたはここでいくつかのメモリを無駄にするが、あなたはバージョンアップを達成する。

これは可能かどうかわかりませんが、一般的にJVMは新しいバージョンで直接スワップをサポートしていないようですが、何らかの方法で非表示にすることができるはずです。

0

(新しいエージェントを追加し、私はこれが動作しますわからないんだけど、それはあなたにいくつかのオプションを与えることがあります...代わりに(のは、ツールエージェントこれを呼びましょう)現在のエージェントを再ロードしようとしているの

インストーラエージェント)。インストーラエージェントは正確に1つの機能を持ちます:RedefineClasses()を使って元のツールエージェントクラスを置き換えます。

バージョン番号を使用してインストーラエージェントにクラス名(MyToolInstallerV1)の名前を付けた場合、ツールエージェントを更新する新しいインストーラをロードし続けることができます。サイズが問題になった場合、おそらくインストーラエージェントは以前のインストーラを探して、そのクラスを小さなノーオペレーションスタブで置き換えることができます。

0

私は今まで何も装備していませんが、java.util.ServiceLoaderでプレイしていて、URLClassLoaderのアプローチで動的JARロードアンロードを実行するプラグインアーキテクチャを実装しました。

"instrumentation"がこのように変更される可能性はありますが、バージョン管理と動的ロードアンロードの問題を追跡することはできますが、ServiceLoaderちょうど小さな/ META-INF/services/XXX仕様に従ってください)、あなたは準備ができています。

よろしくお願いします。

0

OSGIの完璧な使用例。あなたのエージェントをバンドルとして接続できるかどうかはわかりません。

関連する問題