Java Agent的認識、開發和使用
認識
Java Agent即Java探針技術, 通過Java Interface的方式對JVMTI(JVM Tool Interface) 底層一些功能的調用進而實現一些自己想要的應用功能, 比如應用程序性能分析, 應用調用監控攔截等功能
JVMTI介紹
JVMTI是JVM向外暴露的一批接口, 提供了諸如獲取JVM中線程, 內存, 堆棧, 方法, 定時器等功能, 通過這些接口我們可以完全的把控應用的運行時信息, 運行時的攔截跟蹤等; 同時它也是JPDA架構中處於最地下的一層服務接口,在其之上才構建出Java應用的Debug架構體系;
instrument包介紹
jdk的java.lang.instrument包下面定義了JVM中Class的存在形式及修改轉化Class定義文件的接口. 這些接口由JVM開發商(sun)實現. 我們就可以使用這些接口進而對Class進行修改;
運行原理
定義Java Agent的jar
一個Java Agent就是一個普通的jar文件, 然後在jar的MANIFEST.MF文件中聲明jar的執行入口class路徑, 比如
Premain-Class: x.y.z.MainClass
Agent jar的入口class
一個普通的Java-class, 然後需要有一個限定名稱和入參的靜態方法
public static void premain(String agentArgs, Instrumentation instrumentation) throws PluginException, IOException {
// 自定義切入邏輯代碼
}
java命令指定Agent參數
java -javaagent:{agent-jar-path} -D{agent.param.key}={agent.param.value} -jar {app-jar-path}
啓動步驟
JVM啓動時, 在加載應用jar之前, 在加在Instrumentation的實現類時, 就會調用到我們自己寫的Agent的Main方法中去, 去執行我們自己的邏輯;