当前位置: 首页 > 知识库问答 >
问题:

如何在代码中动态添加Java代理jar后卸载它们?Java工具

丘智志
2023-03-14

我创建了一个 java 代理 jar 文件(在命令行上完美运行)。接下来,我想将此代理连接到 j2ee 服务器中正在运行的 JVM。所以我使用了代码:

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);
    }
}

编辑:现在可以工作了,我可以看到Transformer被调用了。我还可以移除变压器,并能够调试变压器。

我的问题是:

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

共有1个答案

秦联
2023-03-14

嗯,有几件事需要考虑:

如果你加载代理,你就加载类。只要相关的类加载器在JavaVM的内存中,相关的类就会保持加载状态。我不认为你能轻易地阻止/规避。但是这应该只是你通过加载代理而增加的一小部分内存开销。

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

VM启动后的启动代理

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

但是,您可以影响的是代理正在做什么。

您想关闭该代理?提供关闭方法。

如果您想从外部停止代理,这个代理可以提供一个JMXBean来关闭代理。

然后,该方法可以从插装接口中移除转换器,或者停止代理在Java VM中正在做的任何事情(释放被占用的引用/资源,以便对象被垃圾收集,诸如此类)。

如果不更具体地说明你想要实现的目标,就很难给出一个更合适的答案。

 类似资料:
  • 本文向大家介绍Java静态代码块加载驱动代码实例,包括了Java静态代码块加载驱动代码实例的使用技巧和注意事项,需要的朋友参考一下 Demo1.funx(); String s=Demo1.string; 静态代码块 会在new一个该类对象时调用 或者调用该类的静态方法,静态成员变量时调用 总之在类加载器将该类加载到内存中时 (无论是通过哪种方式) 都会调用静态代码块 静态成员变量 静态代码块永远

  • 我在这个stackoverflow问题中使用了以下命令。但它并没有从我的mac上删除VS代码。我仍然看到了。配置与vscode图标相关的文件,当我点击它时,它会打开vscode应用程序。 我对也有同样的问题。如何卸载这些应用程序:(

  • 我知道如何加载CSS。 怎么卸载?

  • 本文向大家介绍浅谈Java代理(jdk静态代理、动态代理和cglib动态代理),包括了浅谈Java代理(jdk静态代理、动态代理和cglib动态代理)的使用技巧和注意事项,需要的朋友参考一下 一、代理是Java常用的设计模式,代理类通过调用被代理类的相关方法,并对相关方法进行增强。加入一些非业务性代码,比如事务、日志、报警发邮件等操作。 二、jdk静态代理 1、业务接口 2、业务实现类 3、代理类

  • 问题内容: 假设我键入“ sout”,智能感知应将其扩展为“ System.out.println()”。有没有添加此类模板的方法? 问题答案: 该功能在Eclipse中称为“代码模板”。您可以使用以下方法添加模板: 窗口->首选项-> Java->编辑器->模板。 两篇好文章: 不要编写代码,生成它 自定义模板 另外,这个SO问题: 有用的Eclipse Java代码模板 已映射到,因此您可以通

  • 问题内容: 假设你创建了一个新项目,并希望它使用某个第三方库,例如。你在哪里添加此JAR: 文件>>项目属性>>图书馆>> 编译时库 ; 要么 文件>>项目属性>>图书馆>> 运行时库 ; 要么 工具>>库(库管理器)>>库类路径;要么 工具>> Java平台(Java平台管理器) 所有这些对话框似乎都做相同的事情,但是我敢肯定它们都有正确的用法。在网上找不到好的“最佳实践”文章,并且“ NetB