Java Agent是目前各種監(jiān)測(cè)調(diào)試JVM的主要技術(shù)。Eclipse,IntelliJ,Visual VM ,JConsole 等都依賴(lài)于此技術(shù)。相信你們的Java 程序部署的時(shí)候肯定也會(huì)配置各種Java Agent相關(guān)的信息。下面給大家盤(pán)一盤(pán)Java Agent!
1 Java Agent的作用
Java Agent是java.lang.instrument.Instrumentation API的一部分,Instrumentation 提供了修改字節(jié)碼的機(jī)制。并且可以動(dòng)態(tài)或者靜態(tài)地完成。這意味著我們可以在不接觸源程序代碼的情況下,向程序中添加一些代碼來(lái)改變程序。Java Agent有多種用途,如面向切面編程(AOP),程序分析等。AOP可以在不修改原有代碼的情況下向程序提供日志記錄或安全類(lèi)似的功能。
我們也可以使用JavaAgent來(lái)操控字節(jié)碼可以和其他的程序進(jìn)行組合。在JVM的層面監(jiān)聽(tīng)對(duì)象創(chuàng)建、垃圾回收,線程創(chuàng)建等
性能分析工具使用了大量Java Agent 在程序執(zhí)行的時(shí)候分析JVM的一些參數(shù)指標(biāo)。
2 Java Agent的原理
Agent類(lèi)必須實(shí)現(xiàn)下面的方法,這個(gè)方法就是agent類(lèi)的入口,類(lèi)似于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方法沒(méi)有找到,那么JVM會(huì)調(diào)用他的重載方法。方法如下:
public static void premain(String agentArgs)
JVM 啟動(dòng)之后,可以通過(guò)attach去調(diào)用agentmain方法,許多動(dòng)態(tài)的JVM參數(shù)分析都是通過(guò)這個(gè)方法來(lái)完成的。
public static void agentmain(String agentArgs, Instrumentation inst)
同樣的如果上述agentmain方法沒(méi)有找到,那么也會(huì)執(zhí)行其重載方法的版本。
public static void agentmain(String agentArgs)
下圖為 OpenJDK11中的Agent類(lèi):
3 一個(gè)自定義Agent示例
下面我們實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Java Agent類(lèi)來(lái)體驗(yàn)一下Agent。
3.1 自定義Agent類(lèi)
創(chuàng)建普通Maven工程并新建Agent啟動(dòng)類(lèi)
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類(lèi)打成jar包
將上述自定義Java Agent 類(lèi)打包到j(luò)ar包中,增加Maven build 參數(shù)如下
執(zhí)行 mvn clean package命令打包后,可以看到taget目錄下的jar包文件如下。
3.3 使用java命令使用指定的agent
這里我們使用java命令行啟動(dòng)并使用我們自定義的Java Agent類(lèi)
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é)
本片簡(jiǎn)單介紹了Java Agent類(lèi)的使用,并給出了一個(gè)簡(jiǎn)單的Agent代碼示例。其中Visual VM ,JConsole 等工具會(huì)使用JDK自帶的Agent來(lái)實(shí)現(xiàn)實(shí)現(xiàn)JVM狀態(tài)分析。同樣arthas 和skywalking也是使用的agent的技術(shù)來(lái)實(shí)現(xiàn)對(duì)JVM的監(jiān)測(cè)分析。
-
JAVA
+關(guān)注
關(guān)注
20文章
2984瀏覽量
106858 -
編程
+關(guān)注
關(guān)注
88文章
3679瀏覽量
94865 -
代碼
+關(guān)注
關(guān)注
30文章
4886瀏覽量
70253 -
Agent
+關(guān)注
關(guān)注
0文章
128瀏覽量
27557 -
JVM
+關(guān)注
關(guān)注
0文章
160瀏覽量
12518
發(fā)布評(píng)論請(qǐng)先 登錄
Java泛型的背景和作用

《AI Agent 應(yīng)用與項(xiàng)目實(shí)戰(zhàn)》第1-2章閱讀心得——理解Agent框架與Coze平臺(tái)的應(yīng)用
《AI Agent應(yīng)用與項(xiàng)目實(shí)戰(zhàn)》閱讀體驗(yàn)--跟著迪哥學(xué)Agent
【「零基礎(chǔ)開(kāi)發(fā)AI Agent」閱讀體驗(yàn)】+初品Agent
【「零基礎(chǔ)開(kāi)發(fā)AI Agent」閱讀體驗(yàn)】+Agent的工作原理及特點(diǎn)
【「零基礎(chǔ)開(kāi)發(fā)AI Agent」閱讀體驗(yàn)】+Agent開(kāi)發(fā)平臺(tái)
輕量級(jí)Agent平臺(tái)怎么測(cè)試?
樹(shù)莓派如何開(kāi)發(fā)Agent
基于使命的Agent組織模型
嵌入式輕量Agent平臺(tái)的構(gòu)建研究
關(guān)于Java變量的作用域分析
Java中bean的作用域

java-hot-reload-agent java熱更新插件

評(píng)論