Arthas整體架構(gòu)初探!
你知道的越多,不知道的就越多,業(yè)余的像一棵小草!
你來,我們一起精進(jìn)!你不來,我和你的競爭對手一起精進(jìn)!
編輯:業(yè)余草
來源:juejin.cn/post/7182967420544352315
推薦:https://t.zsxq.com/13Bzo3HUh
自律才能自由
開篇
Arthas是Alibaba開源的Java診斷工具,日常用這個工具排查很多問題,例如:類沖突問題、接口耗時很長問題、線程池阻塞問題等等,arthas還支持獲取堆中對象、執(zhí)行對象方法、修改對象屬性值,真的是有了Arthas便可為所欲為!
當(dāng)前對它的命令還算比較熟練了,想再進(jìn)一步了解一下這個神器,學(xué)習(xí)它的原理和設(shè)計。
Arthas用到了JVM Attach API、Java agent、JVMTI、ClassLoader類隔離等技術(shù),后面我們將跟著Arthas源碼去探索一下神器是如何巧妙地使用這些手段。
本文,將從了解Arthas項目整體結(jié)構(gòu)開始。
初探Arthas項目結(jié)構(gòu)
源碼工程結(jié)構(gòu)
先從github上clone最新的Arthas源碼,地址:https://github.com/alibaba/arthas。
從github上看到Arthas源碼約74%是Java寫的,看到這就放心了,源碼理解起來應(yīng)該不會很費(fèi)勁。
再將源碼導(dǎo)入IDEA,項目結(jié)構(gòu)如下:
模塊比較多,我們挑重點(diǎn)講解一下:
| 模塊 | 功能 |
|---|---|
| agent | Java agent的模塊 |
| arthas-vmtool | vmtool命令由這個模塊實現(xiàn) |
| async-profiler | 火焰圖相關(guān) |
| boot | 啟動入口 |
| core | 核心功能模塊,包括:1.attach宿主應(yīng)用進(jìn)程,load arthas-agent 2.核心命令的實現(xiàn) 3.和arthas-client通信 |
| math-game | 一個測試用的demo |
| memorycompiler | 字節(jié)碼編譯。 |
| packaging | 定義項目打包的規(guī)則 |
| spy | 只包含Spy類,簡單理解為實現(xiàn)類似spring aop的Advice,有前置方法,后置方法等 |
| tunnel-client、tunnel-common、tunnel-server | tunnel-server/tunnel-client 實現(xiàn)遠(yuǎn)程管理/連接多個 Agent |
| web-ui | Web Console用到的前端資源 |
打包后工程結(jié)構(gòu)
在github上下載RELEASE包,地址: https://github.com/alibaba/arthas/releases,下載「arthas-bin.zip」文件。解壓文件,可以看到打包后的項目結(jié)構(gòu):
其中,重點(diǎn)關(guān)注其中的jar包。
| 模塊 | 功能 |
|---|---|
| arthas-agent.jar | 是一個Java agent的jar,支持Attach API方式被動態(tài)加載,也支持-javaagent:方式被靜態(tài)加載 |
| arthas-boot.jar、as.sh、as.bat | 啟動入口 |
| arthas-client.jar | 客戶端程序,用來連接掛載于宿主應(yīng)用進(jìn)程的arthas-core |
| arthas-core.jar | 核心功能模塊,包括:1.attach宿主應(yīng)用進(jìn)程,load arthas-agent 2.核心命令的實現(xiàn) 3.和arthas-client通信 |
| arthas-spy.jar | 只包含Spy類,簡單理解為實現(xiàn)類似spring aop的Advice,有前置方法,后置方法等 |
| math-game.jar | 一個測試用的demo |
核心模塊
arthas-boot、as.sh、as.bat
arthas-boot、as.sh、as.bat功能類似,arthas-boot是java的方式,可以通過jar -jar arthar-boot.jar啟動arthas服務(wù)端,而as.sh是通過腳本的方式啟動arthas服務(wù)端。我們用java -jar arthas-boot.jar啟動或者as.sh啟動,會加載出下面的界面:
arthas-core
arthas-boot里啟動類com.taobao.arthas.boot.Bootstrap用到了通過java -jar arthas-core.jar啟動子進(jìn)程,
這個子進(jìn)程只會短暫存在。該進(jìn)程的信息示例:
MacBook-Pro:arthas-github terry$ ps -ef|grep arthas-core
503 43456 43321 0 10:35PM ?? 0:00.23 /Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/../bin/java -Xbootclasspath/a:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/../lib/tools.jar -jar /Users/terry/software_developmet_1/arthas/arthas-bin-3.6.7/arthas-core.jar -pid 43120 -core /Users/terry/software_developmet_1/arthas/arthas-bin-3.6.7/arthas-core.jar -agent /Users/terry/software_developmet_1/arthas/arthas-bin-3.6.7/arthas-agent.jar
java -jar arthas-core.jar運(yùn)行時,會執(zhí)行com.taobao.arthas.core.Arthas#main,然后解析參數(shù),attach到目標(biāo)進(jìn)程,目標(biāo)進(jìn)程掛載arthas-agent.jar,arthas-agent的premain方法com.taobao.arthas.agent334.AgentBootstrap#premain會執(zhí)行,然后加載arthas-core.jar【多次出現(xiàn)arthar-core.jar,感覺設(shè)計不是很好,應(yīng)該分離多個模塊】,此時會調(diào)用com.taobao.arthas.core.server.ArthasBootstrap,com.taobao.arthas.core.server.ArthasBootstrap會加載spy.jar
arthas-client
arthas-client是arthas客戶端,支持通過telnet的方式連接到arthas服務(wù)端。
arthas-agent
一個Java agent的jar,支持Attach API方式被動態(tài)加載,也支持-javaagent:方式被靜態(tài)加載。arthas-agent的premain或者agentmain方法會執(zhí)行com.taobao.arthas.agent334.AgentBootstrap#main會執(zhí)行,然后加載arthas-core.jar
arthas-spy
arthas-core.jar被掛載到宿主應(yīng)用的進(jìn)程后,arthas-core會讓BootstrapClassLoader去加載arthas-spy.jar。該模塊只包含Spy類,簡單理解為實現(xiàn)類似spring aop的Advice,有前置方法,后置方法等。
小結(jié)
本文簡述了 arthas 的項目結(jié)構(gòu)和核心模塊,感興趣的網(wǎng)友可以自行梳理一下 arthas 啟動流程。當(dāng)然我后面也會繼續(xù)給大家輸出這方面的內(nèi)容!
