不同的Java应用程序可以使用相同的javaagent吗?

时间:2016-08-17 07:16:34

标签: java jvm javaagents

我有一个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.jarapp2.jarapp3.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崩溃时触发。

2 个答案:

答案 0 :(得分:2)

每个JVM实例都是独立的,并且不会知道&#34;关于其他JVM,除非您在应用程序级别执行某些操作。所以,通常答案是&#34;是的,您可以使用相同的jar或者javaagent,因为你可以使用相同数量的JVM实例。&#34;

答案 1 :(得分:0)

VM处理Javaaget与类路径上的jar文件类似。这些文件是只读的,所有状态都包含在正在运行的VM中,以便它们可以在多个进程之间安全地共享。