【发布时间】:2014-10-09 09:57:32
【问题描述】:
我发现 Java attach API 可以加载 javaagent,如下代码:
import com.sun.tools.attach.VirtualMachine;
import com.sun.tools.attach.VirtualMachineDescriptor;
import java.util.List;
public class ListVM{
public static void main(String[] args){
List<VirtualMachineDescriptor> vmList = VirtualMachine.list();
for(VirtualMachineDescriptor vm : vmList){
System.out.println("name: " + vm.displayName() + " id :" + vm.id());
try{
VirtualMachine vm0 = VirtualMachine.attach(vm.id());
// load agent, agnet class's agentmain will be invoked.
vm0.loadAgent("/root/tmp/ChinaAgent.jar");
System.out.println("Load agent done.");
vm0.detach();
}catch(Exception e) {
System.out.println("exception : " + e.getMessage());
}
}
}
}
声明:vm0.loadAgent("/root/tmp/ChinaAgent.jar"); 加载代理 jar 文件。
但是代理的代码只会运行一次,
所以我猜代理 jar 只加载了一次,这意味着 Jvm 会阻止多次加载代理。
这是真的吗?为什么?
希望能有一些代码来证明!
谢谢!
【问题讨论】:
标签: java jvm jvm-hotspot