Java Agent是目前各種監測調試JVM的主要技術。Eclipse,IntelliJ,Visual VM ,JConsole 等都依賴于此技術。相信你們的Java 程序部署的時候肯定也會配置各種Java Agent相關的信息。下面給大家盤一盤Java Agent!
1 Java Agent的作用
Java Agent是java.lang.instrument.Instrumentation API的一部分,Instrumentation 提供了修改字節碼的機制。并且可以動態或者靜態地完成。這意味著我們可以在不接觸源程序代碼的情況下,向程序中添加一些代碼來改變程序。Java Agent有多種用途,如面向切面編程(AOP),程序分析等。AOP可以在不修改原有代碼的情況下向程序提供日志記錄或安全類似的功能。
我們也可以使用JavaAgent來操控字節碼可以和其他的程序進行組合。在JVM的層面監聽對象創建、垃圾回收,線程創建等
性能分析工具使用了大量Java Agent 在程序執行的時候分析JVM的一些參數指標。
2 Java Agent的原理
Agent類必須實現下面的方法,這個方法就是agent類的入口,類似于java 的main方法入口。
public static void premain(String agentArgs, Instrumentation inst)
JVM初始化之后main方法執行之前premain方法會被調用,程序中可以有多個agent。每一個agent都是按照JVM初始化的順序進行調用。如果上述 premain方法沒有找到,那么JVM會調用他的重載方法。方法如下:
public static void premain(String agentArgs)
JVM 啟動之后,可以通過attach去調用agentmain方法,許多動態的JVM參數分析都是通過這個方法來完成的。
public static void agentmain(String agentArgs, Instrumentation inst)
同樣的如果上述agentmain方法沒有找到,那么也會執行其重載方法的版本。
public static void agentmain(String agentArgs)
下圖為 OpenJDK11中的Agent類:
3 一個自定義Agent示例
下面我們實現一個簡單的Java Agent類來體驗一下Agent。
3.1 自定義Agent類
創建普通Maven工程并新建Agent啟動類
public class JavaNorthAgent {
//JVM啟動時的agent 方法
public static void premain(String agentArgs, Instrumentation inst) {
System.out.println("premain --- agentArgs:" + agentArgs + " |inst:" + inst.toString());
}
// JVM運行中的agent 方法
public static void agentmain(String agentArgs, Instrumentation inst){
System.out.println("agentmain --- agentArgs:" + agentArgs + " |inst:" + inst.toString());
}
}
3.2 將Agent類打成jar包
將上述自定義Java Agent 類打包到jar包中,增加Maven build 參數如下
執行 mvn clean package命令打包后,可以看到taget目錄下的jar包文件如下。
3.3 使用java命令使用指定的agent
這里我們使用java命令行啟動并使用我們自定義的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
輸出結果如下:
總結
本片簡單介紹了Java Agent類的使用,并給出了一個簡單的Agent代碼示例。其中Visual VM ,JConsole 等工具會使用JDK自帶的Agent來實現實現JVM狀態分析。同樣arthas 和skywalking也是使用的agent的技術來實現對JVM的監測分析。
-
JAVA
+關注
關注
19文章
2976瀏覽量
105211 -
編程
+關注
關注
88文章
3639瀏覽量
94031 -
代碼
+關注
關注
30文章
4836瀏覽量
69119 -
Agent
+關注
關注
0文章
106瀏覽量
26809 -
JVM
+關注
關注
0文章
158瀏覽量
12270
發布評論請先 登錄
相關推薦
![](https://file1.elecfans.com/web2/M00/85/F7/wKgZomRmRpCAY6wCAACoecT9WaA813.png)
如何實現User-Agent
輕量級Agent平臺怎么測試?
樹莓派如何開發Agent
基于使命的Agent組織模型
基于Agent的機線資源管理系統的設計
嵌入式輕量Agent平臺的構建研究
Agent技術研究與分析
![<b class='flag-5'>Agent</b>技術研究與分析](https://file.elecfans.com/web2/M00/48/F9/pYYBAGKhtDCAAvCWAAAOgLiSnSM682.jpg)
Java中bean的作用域
![<b class='flag-5'>Java</b>中bean的<b class='flag-5'>作用</b>域](https://file.elecfans.com/web2/M00/49/DB/pYYBAGKhvGuAEjgUAAAcyznjVo8310.png)
java-hot-reload-agent java熱更新插件
![<b class='flag-5'>java-hot-reload-agent</b> <b class='flag-5'>java</b>熱更新插件](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論