gpt4 book ai didi

Java VirtualMachine.loadAgent 仅一次加载代理

转载 作者:行者123 更新时间:2023-11-30 03:43:36 63 4
gpt4 key购买 nike

我发现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 阻止多次加载代理。

这是事实吗?为什么?

希望能有一些代码来证明这一点!

谢谢!

最佳答案

当您调用 loadAgent 时,代理 jar 会运行一次。 agentmain Agent-Class指定的代理类的方法调用 JAR list 中的属性。

该类实际上加载一次,除非您做了一些优化来卸载类。因此,如果您在同一个 jar 上多次调用 loadAgent,则不会重新加载类,而是 Agent_OnAttach (agentmain) 可能会被多次调用。实际上它是特定于平台的并且取决于 JVM 实现。

loadAgent 方法调用 loadAgentLibrary 调用 Agent_OnAttach 这是特定于平台的

引用文献:

关于Java VirtualMachine.loadAgent 仅一次加载代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26275503/

63 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com