开发者社区 > 云原生 > 正文

各位大佬能咨询一个 java agent 方面的问题吗? 我编写了一个简单的 java agent

各位大佬能咨询一个 java agent 方面的问题吗? 我编写了一个简单的 java agent 只在代码中agentmain 打印了一句话

public static void agentmain(String args, Instrumentation inst) { return; }

调用attach(pid)后,然后调用了virtualMachine.detach(); 但是却无法卸载这个agent(无法移动,删除),必须重启被注入的 java 进程, 请问我还需要做什么操作?

展开
收起
百问录 2023-03-24 12:12:44 477 0
2 条回答
写回答
取消 提交回答
  • 在agentmain方法中,你需要调用inst.removeTransformer方法将你的transformer从Instrumentation中移除,这样才能正确卸载agent。具体来说,你需要在agentmain方法中添加以下代码:

    public static void agentmain(String args, Instrumentation inst) { // 移除transformer inst.removeTransformer(yourTransformer); }

    其中,yourTransformer指的是你在premain或agentmain方法中注册的Transformer对象。请注意,如果你在premain方法中注册了Transformer,那么在agentmain方法中也需要调用inst.addTransformer方法将Transformer重新注册一遍,然后再调用inst.removeTransformer方法将其移除。

    如果你的Transformer类实现了java.lang.instrument.ClassFileTransformer接口,那么你需要在removeTransformer方法中传入该Transformer对象的引用,例如:

    inst.removeTransformer(yourTransformer);

    如果你的Transformer类没有实现ClassFileTransformer接口,而是通过redefineClasses方法进行类重新定义的,那么你需要在removeTransformer方法中传入要卸载的类的类名,例如:

    inst.removeTransformer("com.example.YourClass");

    注意,在调用removeTransformer方法之前,确保已经对需要卸载的类进行了解除或者重新定义操作。

    此答案来自钉钉群“Arthas开源交流群"

    2023-03-24 18:22:39
    赞同 展开评论 打赏
  • 发表文章、提出问题、分享经验、结交志同道合的朋友

    使用 Java Agent 时:

    • 在 agentmain 方法中,需要将需要被修改的类进行重新定义,可以通过 Instrumentation 接口提供的 redefineClasses 方法实现。如果没有进行重新定义,那么在卸载 Agent 之后,被修改的类仍然会存在于 JVM 中,因此可能会导致无法删除或移动 Agent。

    • 在卸载 Agent 之前,需要确保已经解除对所有需要被修改的类的引用,否则可能会导致无法卸载 Agent。

    2023-03-24 14:38:17
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载