做者 | agmtopy java
【Arthas 官方社區正在舉行徵文活動,參加即有獎品拿~點擊投稿】linux
因爲在項目中遇到一種狀況,某段代碼在進行單元測試和在 tomcat 容器中運行的性能相差數百倍,所以須要分析在不一樣環境下某個方法執行的具體時間,從而肯定問題。Arthas 能夠作到無侵入的監控應用遠行狀況。git
安裝:github
wget https://alibaba.github.io/arthas/arthas-boot.jar java -jar arthas-boot.jar
linux 下直接執行,window 下載文件後執行。tomcat
執行完成後,顯示當前 path 中指定的 JDK 中正在運行的 java 進程輸入相應序號,進入 sh 命令,表示已鏈接成功。session
Arthas 命令初步使用,大概分爲 5 類:less
請注意,這些命令,都經過字節碼加強技術來實現的,會在指定類的方法中插入一些切面來實現數據統計和觀測,所以在線上、預發使用時,請儘可能明確須要觀測的類、方法以及條件,診斷結束要執行 shutdown 或將加強過的類執行 reset 命令。jvm
經過圖示代表調用 MongoTemplate.executeFindMultiInternal() 方法時,最耗時的方法是在 doWith() 方法,總共執行 10000 次,耗時 ==252.3064ms==,最少一次調用耗時 ==0.0132ms==,最大一次耗時 ==38.4329ms==,分析緣由仍是在於數據量太大,MongoTemplate 經過循環遍歷出結果在進行序列化。ide
jad com.sankuai.inf.leaf.common.ZeroIDGen
watch com.sankuai.inf.leaf.server.service.SegmentService getId '{params, target, returnObj}' -x 2
params 表示入參,target 表示當前的類,returnObj 表示返回值。微服務
stack com.sankuai.inf.leaf.server.service.SegmentService getId
sc -d com.sankuai.inf.leaf.server.service.SegmentService getId
thread b
能夠看出當前線程正在等待 ReentrantLock$NonfairSync@118f1fb4,而持有這個對象的線程又在等待當前線程釋放,從而造成死鎖!
先放一張官方的總結大圖:
總結:Arthas 是一個很優秀的 java 診斷工具,不管是安裝仍是使用都很簡潔,而且使用文檔全面、清晰明瞭,值得好好研究一番。
Arthas 官方正在舉行徵文活動,若是你有:
不限,其它與 Arthas 有關的內容
歡迎參加徵文活動,還有獎品拿哦~點擊投稿
「阿里巴巴雲原生關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,作最懂雲原生開發者的公衆號。」