Java Agent是目前各種監(jiān)測(cè)調(diào)試JVM的主要技術(shù)。Eclipse,IntelliJ,Visual VM ,JConsole 等都依賴于此技術(shù)。相信你們的Java 程序部署的時(shí)候肯定也會(huì)配置各種Java Agent相關(guān)的信息。下面給大家盤一盤Java Agent!
1 Java Agent的作用
Java Agent是java.lang.instrument.Instrumentation API的一部分,Instrumentation 提供了修改字節(jié)碼的機(jī)制。并且可以動(dòng)態(tài)或者靜態(tài)地完成。這意味著我們可以在不接觸源程序代碼的情況下,向程序中添加一些代碼來改變程序。Java Agent有多種用途,如面向切面編程(AOP),程序分析等。AOP可以在不修改原有代碼的情況下向程序提供日志記錄或安全類似的功能。
我們也可以使用JavaAgent來操控字節(jié)碼可以和其他的程序進(jìn)行組合。在JVM的層面監(jiān)聽對(duì)象創(chuàng)建、垃圾回收,線程創(chuàng)建等
性能分析工具使用了大量Java Agent 在程序執(zhí)行的時(shí)候分析JVM的一些參數(shù)指標(biāo)。
2 Java Agent的原理
Agent類必須實(shí)現(xiàn)下面的方法,這個(gè)方法就是agent類的入口,類似于java 的main方法入口。
public static void premain(String agentArgs, Instrumentation inst)
JVM初始化之后main方法執(zhí)行之前premain方法會(huì)被調(diào)用,程序中可以有多個(gè)agent。每一個(gè)agent都是按照J(rèn)VM初始化的順序進(jìn)行調(diào)用。如果上述 premain方法沒有找到,那么JVM會(huì)調(diào)用他的重載方法。方法如下:
public static void premain(String agentArgs)
JVM 啟動(dòng)之后,可以通過attach去調(diào)用agentmain方法,許多動(dòng)態(tài)的JVM參數(shù)分析都是通過這個(gè)方法來完成的。
public static void agentmain(String agentArgs, Instrumentation inst)
同樣的如果上述agentmain方法沒有找到,那么也會(huì)執(zhí)行其重載方法的版本。
public static void agentmain(String agentArgs)
下圖為 OpenJDK11中的Agent類:
3 一個(gè)自定義Agent示例
下面我們實(shí)現(xiàn)一個(gè)簡單的Java Agent類來體驗(yàn)一下Agent。
3.1 自定義Agent類
創(chuàng)建普通Maven工程并新建Agent啟動(dòng)類
public class JavaNorthAgent {
//JVM啟動(dòng)時(shí)的agent 方法
public static void premain(String agentArgs, Instrumentation inst) {
System.out.println("premain --- agentArgs:" + agentArgs + " |inst:" + inst.toString());
}
// JVM運(yùn)行中的agent 方法
public static void agentmain(String agentArgs, Instrumentation inst){
System.out.println("agentmain --- agentArgs:" + agentArgs + " |inst:" + inst.toString());
}
}
3.2 將Agent類打成jar包
將上述自定義Java Agent 類打包到j(luò)ar包中,增加Maven build 參數(shù)如下
執(zhí)行 mvn clean package命令打包后,可以看到taget目錄下的jar包文件如下。
3.3 使用java命令使用指定的agent
這里我們使用java命令行啟動(dòng)并使用我們自定義的Java Agent類
public class Main {
public static void main(String[] args) {
javaNorth("Java North Agent");
}
public static void javaNorth(String message){
System.out.println(message);
}
}
java -javaagent:E:javaNorthjavanorthagenttargetjavanorthagent-1.0-SNAPSHOT.jar="hello javanorth" com.javanorth.agent.Main
輸出結(jié)果如下:
總結(jié)
本片簡單介紹了Java Agent類的使用,并給出了一個(gè)簡單的Agent代碼示例。其中Visual VM ,JConsole 等工具會(huì)使用JDK自帶的Agent來實(shí)現(xiàn)實(shí)現(xiàn)JVM狀態(tài)分析。同樣arthas 和skywalking也是使用的agent的技術(shù)來實(shí)現(xiàn)對(duì)JVM的監(jiān)測(cè)分析。
-
JAVA
+關(guān)注
關(guān)注
19文章
2974瀏覽量
104977 -
編程
+關(guān)注
關(guān)注
88文章
3637瀏覽量
93911 -
代碼
+關(guān)注
關(guān)注
30文章
4823瀏覽量
68900 -
Agent
+關(guān)注
關(guān)注
0文章
106瀏覽量
26778 -
JVM
+關(guān)注
關(guān)注
0文章
158瀏覽量
12252
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論