首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在代码中动态添加Java代理jars之后卸载它们?Java仪器仪表

如何在代码中动态添加Java代理jars之后卸载它们?Java仪器仪表
EN

Stack Overflow用户
提问于 2013-08-05 11:53:40
回答 1查看 2.4K关注 0票数 3

我已经创建了一个java代理jar文件(它在命令行上工作得很好)。接下来,我想将该代理附加到j2ee服务器中正在运行的JVM上。所以我用了密码:

代码语言:javascript
复制
public static void loadAgent() {   

    System.out.println("dynamically loading javaagent");
    String nameOfRunningVM = ManagementFactory.getRuntimeMXBean().getName();
    int p = nameOfRunningVM.indexOf('@');
    String pid = nameOfRunningVM.substring(0, p);

    try {
        VirtualMachine vm = VirtualMachine.attach(pid);
        String jarFilePath = vm.getSystemProperties().getProperty("java.home")+File.separator+"lib"+File.separator+"test-agent-7.jar";            
        vm.loadAgent(jarFilePath, "");
        vm.detach();
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

编辑:这是现在的工作,我可以看到变压器被调用。我也可以移除变压器和能够调试变压器。

我的问题是:

  • 如何卸载完这个java代理jar?
  • 是关闭/重新启动JVM的唯一方法吗?
  • 如果把罐子留在内存中,会有什么影响吗?
EN

回答 1

Stack Overflow用户

发布于 2013-12-12 13:26:10

嗯,有几件事要考虑:

如果加载代理,则加载类。只要相关的类加载器在Java的内存中,关联的类就会保持加载。我不认为你能轻易地阻止/规避这件事。但是,这应该只是一个小的内存开销,您可以通过加载代理来激发它。

一些研究表明,代理将由SystemClassLoader加载,因此卸载这些类是不可能的。

VM启动后启动代理 实现可能提供一种机制,用于在VM启动后的某个时候启动代理。关于如何启动的详细信息是特定于实现的,但通常应用程序已经启动,并且已经调用了它的主要方法。在实现支持VM启动后启动代理的情况下,应用如下:代理JAR的清单必须包含属性Agent-Class。此属性的值是代理类的名称。代理类必须实现公共静态agentmain方法。系统类加载器( ClassLoader.getSystemClassLoader)必须支持将代理JAR文件添加到系统类路径的机制。链接到源

然而,你能影响到的是代理人正在做的事情。

你想关掉那个探员吗?提供关闭方法。

如果要从外部停止代理,此代理可以提供一个关闭代理的JMXBean。

然后,该方法可以将转换器从仪表接口中移除,或者停止代理在Java中执行的其他任何操作(释放保存的引用/资源,以便垃圾收集对象,类似于以下内容)。

如果没有更具体地说明你想要实现什么,就很难给出一个更合适的答案。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18057504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档