3

バイトコードを計測する Java エージェントがあります。Java 6 でアタッチ API を使用して、ユーザーが Java エージェントを使用してエージェントとインスツルメントおよびインスツルメンテーション コードを動的にロードできるようにしています。Boot-Class-Path マニフェスト属性を使用して、javagent クラスがブート クラスパスにあることを確認し、ユーザーが ArrayList などのクラスを計測できるようにしています。

ただし、バージョン管理には問題があります。ユーザーがエージェントのバージョン 1 を動的にアタッチするとします。次に、彼にバージョン 2 を渡しました。彼が私のエージェントのバージョン 1 をアタッチして以来、彼のアプリケーション サーバーはシャットダウンされていないため、バージョン 1 のクラスがまだロードされています。

私のクライアント バージョン 2 の javaagent がバージョン 1 をアンロードするような方法が必要です。

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

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

4

4 に答える 4

1

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

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

代わりに、外界と対話する不変のクラスを作成し、内部でバージョン管理システムを実装できますか?

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

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

于 2009-08-12T17:04:07.207 に答える
0

OSGIの完璧なユースケース。ただし、エージェントをバンドルとしてプラグインできるかどうかはわかりません。

于 2011-01-27T09:37:12.003 に答える
0

これが機能するかどうかはわかりませんが、いくつかのオプションが得られる可能性があります...

現在のエージェント (これをツール エージェントと呼びます) をリロードしようとする代わりに、新しいエージェント (インストーラー エージェント) を追加します。インストーラー エージェントの機能は 1 つだけです。RedefineClasses() を使用して元のツール エージェント クラスを置き換えます。

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

于 2009-08-13T20:19:06.827 に答える
0

私は今のところ何も計測していませんが、java.util.ServiceLoaderで遊んでいて、URLClassLoader のアプローチで動的 JAR ロード/アンロードを使用して、ある種のプラグイン アーキテクチャを実装しているだけです。

「インスツルメンテーション」がこのように変更される可能性があるかどうかはわかりませんが、バージョン管理と動的なロード/アンロードの問題を追跡できます。難しいことは ServiceLoader によって行われるため、テストが非常に高速です (小さな/META-INF/services/XXX 仕様) 準備完了です :)

よろしく。

于 2009-08-17T11:34:31.230 に答える