如何在不停止JVM的情况下将Javaagent添加到JVM?

时间:2011-01-27 14:36:29

标签: java jvm javaagents

我希望在不停止应用程序的情况下分析Java应用程序。我可以在应用程序运行时以某种方式添加Javaagent吗?

4 个答案:

答案 0 :(得分:26)

请参阅Starting a Java agent after program start

它链接到http://dhruba.name/2010/02/07/creation-dynamic-loading-and-instrumentation-with-javaagents/,在“运行时动态加载javaagent”下提供了工作示例:

public static void loadAgent() throws Exception {
    String nameOfRunningVM = ManagementFactory.getRuntimeMXBean().getName();
    String pid = nameOfRunningVM.substring(0, nameOfRunningVM.indexOf('@'));
    VirtualMachine vm = VirtualMachine.attach(pid);
    vm.loadAgent(jarFilePath, "");
    vm.detach();
}

请注意,Java 9在JVM启动参数中需要-Djdk.attach.allowAttachSelf=true

答案 1 :(得分:14)

您可以使用ea-agent-loader

使用它在运行时加载代理将如下所示:

public class HelloAgentWorld
{
    public static class HelloAgent
    {
        public static void agentmain(String agentArgs, Instrumentation inst)
        {
            System.out.println(agentArgs);
            System.out.println("Hi from the agent!");
            System.out.println("I've got instrumentation!: " + inst);
        }
    }

    public static void main(String[] args)
    {
        AgentLoader.loadAgentClass(HelloAgent.class.getName(), "Hello!");
    }
}

答案 2 :(得分:5)

应该可以根据java.lang.instrument包的文档。

  

VM启动后启动代理

     

实现可以提供一种在某个时间启动代理的机制   VM启动后。该   有关如何启动的详细信息   是特定于实现但是   通常应用程序已经   开始,其主要方法有   已被调用。在哪些情况下   一个实现支持   VM拥有后启动代理   开始以下适用:

     

1.代理JAR的清单必须包含该属性   代理级。这个的价值   attribute是代理的名称   类。
  2.代理类必须实现公共静态代理程序   方法。
  3.系统类加载器(ClassLoader.getSystemClassLoader)必须   支持添加代理的机制   JAR文件到系统类路径。

但我从未尝试过: - |

答案 3 :(得分:1)

这是一个通过注入检测来在运行时初始化aspectj和spring-aspects的库:https://github.com/subes/invesdwin-instrument

您可以将其用作更精细的样本。