我希望在不停止Java应用程序的情况下对其进行分析。请问我是否可以在应用程序运行时添加Java代理?
我希望在不停止Java应用程序的情况下对其进行分析。请问我是否可以在应用程序运行时添加Java代理?
请参见Starting a Java agent after program start。
该链接指向 http://dhruba.name/2010/02/07/creation-dynamic-loading-and-instrumentation-with-javaagents/ 页面,在“Dynamic loading of a javaagent at runtime”一节中提供了可行的示例:
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
。
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!");
}
}
在VM启动后启动代理
实现可能会提供一种机制,在VM启动后的某个时刻启动代理。如何启动代理是特定于实现的,但通常应用程序已经启动,它的主方法已经被调用。在实现支持在VM启动后启动代理的情况下,以下内容适用:
1.代理JAR的清单必须包含属性Agent-Class。此属性的值是代理类的名称。
2.代理类必须实现一个公共静态agentmain方法。
3.系统类加载器(ClassLoader.getSystemClassLoader)必须支持一种将代理JAR文件添加到系统类路径的机制。
但我从未尝试过 :-|