02)阿里 Arthas(阿尔萨斯)开源的 Java 诊断工具原理分析、JVM动态加载“代理程序“(Agent) 的机制、vm.loadAgent原理
原理分析
1.Arthas 启动时(java -jar arthas-boot.jar)
Arthas(阿尔萨斯)使用 java -jar arthas-boot.jar 启动时前台启动方式,
这是一个独立的 Java 程序(arthas-boot)。
它会调用 com.sun.tools.attach.VirtualMachine.list() 获取当前系统所有可 attach 的 JVM 进程。
显示列表,等待你选择一个 PID。
2.你输入 PID 后,发生什么?
Arthas 使用 JVM TI(JVM Tool Interface) + Attach API 技术,执行以下操作:
VirtualMachine vm = VirtualMachine.attach("147768"); // attach 到目标 JVM
vm.loadAgent("arthas-agent.jar", "clientPort=3658"); // 注入 agent
这行代码是关键!它把 Arthas 的 agent(arthas-agent.jar)动态加载到目标 JVM 中
3.目标 JVM 内部发生了什么?
当 loadAgent 被调用后,目标 JVM 会执行 arthas-agent.jar 中的 premain 或 agentmain 方法:
public class ArthasAgent {public static void agentmain(String agentArgs, Instrumentation inst)