Command Line

进行 Load-Time Instrumentation,需要从命令行启动 Agent Jar,需要使用 -javagent 选项:

-javaagent:jarpath[=options]

在 Load-Time Instrumentation 过程中,会用到 premain 方法,我们关注两个问题:

  • 第一个问题,Instrumentation 是一个接口,它的具体实现是哪个类?回答:sun.instrument.InstrumentationImpl 类。
  • 第二个问题,是“谁”调用了 premain() 方法的呢?回答:InstrumentationImpl.loadClassAndStartAgent() 方法
public static void premain(String agentArgs, Instrumentation inst)

Attach

进行 Dynmaic Instrumentation,需要用到 Attach API。

Attach API 体现在 com.sun.tools.attach 包。

com.sun.tools.attach 包,最核心的是 VirtualMachine 类。

                                       ┌─── VirtualMachine.attach(String id)
                  ┌─── 1. Get VM ──────┤
                  │                    └─── VirtualMachine.attach(VirtualMachineDescriptor vmd)
                  │
                  │                                            ┌─── VirtualMachine.loadAgent(String agent)
                  │                    ┌─── Load Agent ────────┤
VirtualMachine ───┤                    │                       └─── VirtualMachine.loadAgent(String agent, String options)
                  ├─── 2. Use VM ──────┤
                  │                    │                       ┌─── VirtualMachine.getAgentProperties()
                  │                    └─── read properties ───┤
                  │                                            └─── VirtualMachine.getSystemProperties()
                  │
                  └─── 3. detach VM ───┼─── VirtualMachine.detach()