如何在不停止 JVM 的情况下将 Javaagent 添加到 JVM?
2022-09-02 02:54:14
我希望在不停止应用程序的情况下分析Java应用程序。我可以在应用程序运行时以某种方式添加 Javaagent 吗?
我希望在不停止应用程序的情况下分析Java应用程序。我可以在应用程序运行时以某种方式添加 Javaagent 吗?
请参阅在程序启动后启动 Java 代理。
它链接到 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
您可以使用 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!");
}
}