我有一个javaagent Jar simpleAgent.jar
。我用它来重新定义它中的类,我缓存了一些类以避免redifine
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);
}
}
}
我有三个不同的应用app1.jar
,app2.jar
,app3.jar
,所以当我启动三个应用程序时,我可以使用相同的代理jar吗?例如:
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崩溃时触发。
答案 0 :(得分:2)
每个JVM实例都是独立的,并且不会知道&#34;关于其他JVM,除非您在应用程序级别执行某些操作。所以,通常答案是&#34;是的,您可以使用相同的jar或者javaagent,因为你可以使用相同数量的JVM实例。&#34;
答案 1 :(得分:0)
VM处理Javaaget与类路径上的jar文件类似。这些文件是只读的,所有状态都包含在正在运行的VM中,以便它们可以在多个进程之间安全地共享。