1. 程式人生 > 實用技巧 >Java Agent(上)

Java Agent(上)

1、java agent是什麼?

---》對使用者透明,不侵入使用者業務程式碼。讓java虛擬機器器載入agent jar

2、java agent有什麼用?

--->應用場景例如:呼叫鏈追蹤專案,在使用者無感知的情況下,記錄日誌。目前業內使用該技術的有,SkyWalking,Pinpoint(這個監控的粒度更小)

-各個 Java IDE 的除錯功能,例如 eclipse、IntelliJ ;

-熱部署功能,例如 JRebel、XRebel、 spring-loaded;

-各種線上診斷工具,例如 Btrace、Greys,還有阿里的 Arthas;

-各種效能分析工具,例如 Visual VM、JConsole 等

3、java agent的實現原理?

https://zhuanlan.zhihu.com/p/147375268

4、 入門案例

4.1、 如何製造自己第一個java agent jar包

4.1.1、 第一步:我們需要一個外掛來幫助我們生成帶特定格式的MAINIFEST.MF的jar

4.1.2、 第二步:在啟動專案的時候,在jvm引數中新增 -javaagent: *\ving-agent-0.0.1-SNAPSHOT.jar (在jvm上先載入agent包)

(偷偷地問)特定格式的MAINIFEST.MF是怎樣的?需要包括下面的內容

Manifest-Version: 1.0
Can-Redefine-Classes: true
Can-Retransform-Classes: true
Premain-Class: cn.think.in.java.clazz.loader.asm.agent.PreMainTraceAgent

(再偷偷地問),難度每次都讓我手動去弄這個檔案,我覺得很麻煩呀,有沒一個工具能幫我們將agent專案打包成包含MAINIFEST.MF的jar?

-----》對,你猜對了,真的有這個工具。那就是maven外掛。(說到打包,肯定要想到maven或者gradle了吧)

            <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.2</version>
<configuration>
<archive>
<manifestEntries>
<Project-name>${project.name}</Project-name>
<Project-version>${project.version}</Project-version>
<Premain-Class>com.tuling.agent.Agent</Premain-Class>
<Can-Redefine-Classes>true</Can-Redefine-Classes>
<Can-Retransform-Classes>true</Can-Retransform-Classes>
<Boot-Class-Path>javassist-3.18.1-GA.jar</Boot-Class-Path>
</manifestEntries>
</archive>
<skip>true</skip>
</configuration>
</plugin>

外掛

打包之後

測試