私はjavaagent Jar simpleAgent.jar
を持っています。私はそれにクラスをredifineするためにそれを使用し、私は私が3つのアプリケーションを起動するときに、私は同じエージェントの瓶を使用することができ、三つの異なるアプリケーションapp1.jar
、app2.jar
、app3.jar
を持ってredifine異なるJavaアプリケーションが同じjavaagentを使用できますか?
public class Premain {
private static Instrumentation instrumentation;
private static final Map<String, Class> allLoadClassesMap = new ConcurrentHashMap<>();
public static void premain(String agentArgs, Instrumentation inst) {
instrumentation = inst;
cacheAllLoadedClasses("com.example");
}
public static void cacheAllLoadedClasses(String prfixName) {
try {
Class[] allLoadClasses = instrumentation.getAllLoadedClasses();
for (Class loadedClass : allLoadClasses) {
if (loadedClass.getName().startsWith(prfixName)) {
allLoadClassesMap.put(loadedClass.getName(), loadedClass);
}
}
logger.warn("Loaded Class Count " + allLoadClassesMap.size());
} catch (Exception e) {
logger.error("", e);
}
}
}
を避けるために、いくつかのクラスをキャッシュされましたか?例えば:
java -javaagent:simpleAgent.jar -jar app1.jar
java -javaagent:simpleAgent.jar -jar app2.jar
java -javaagent:simpleAgent.jar -jar app3.jar
私はjavaagentの実装を知らないので、私は同じjavaagentを使用してAPP1またはAPP2またはAPP3クラッシュでトリガできることを怖がっていました。
エージェントの 'jar'ファイルは決して特別なものではありません。あなたは 'jar'ファイルをあなたが望むだけ多くのJVMの間で共有することができます。読み込み専用であれば、普通のクラス読み込みプロセスの場合です。 – Holger