arthas是一個非常方便的Java診斷工具,包括很多功能,例如JVM診斷、應用診斷、Spring應用診斷等。arthas使診斷問題變得更加容易和準確,因此被廣泛地使用。arthas中的火焰圖是一種非常有用的工具,可以大幅度提高Java代碼的診斷效率。
一、什麼是火焰圖
火焰圖是一種可視化的工具,通常用於分析CPU使用情況。橫坐標表示時間,縱坐標表示堆棧。當一個函數調用另一個函數時,這個函數的堆棧會放在上一個函數堆棧的下面。每個堆棧都代表了一段時間內執行的代碼。火焰圖可以讓我們直觀地看到每個函數運行所花費的時間。
二、如何生成arthas火焰圖
和其他火焰圖類似,arthas的火焰圖基於代碼的執行時間和堆棧信息。arthas發揮了自己的優勢,使生成火焰圖變得非常容易。下面是arthas生成火焰圖的代碼:
$ java -jar arthas-boot.jar # 進入想要診斷的Java進程 $ jps $ dashbord # 觸發arthas fireline $ sc -d -t ./fireline $ profie demo.MathGame play $ exit
運行起來,arthas就可以進行CPU分析了。
三、如何閱讀火焰圖
1. 了解火焰圖的結構
一般來說,火焰圖的每一層是一個函數,如下圖所示:
┌─test ├─count ├─factorial ├─main └─print_usage
箭頭的方向表示調用方向。箭頭從下向上表示調用,從上向下表示返回。 每一層的長度表示這個函數的執行時間,即這個函數在整體執行中所佔據的比例。
2. 理解函數執行時間
上一層函數的長度比下一層函數的長度要長,表示上一層函數的執行時間要長。因此,我們可以通過火焰圖來找出執行時間相對比較長的函數,然後去優化它們的執行效率。
3. 了解函數之間的依賴關係
函數之間的依賴關係可以通過火焰圖中的節點箭頭來表示。箭頭從一個函數節點指向另一個函數節點,表示這兩個函數之間存在依賴關係。通過這個關係,我們可以分析函數之間的調用關係。
4. 查找函數和問題
arthas火焰圖可以幫助我們找到潛在的問題。一般情況下,我們可以通過火焰圖來查找執行時間比較長的函數,然後去優化它們的執行效率,這樣可以大幅度地提高整個應用程序的執行效率。
四、如何使用arthas火焰圖
1. 觸發火焰圖的生成
和其他火焰圖一樣,arthas火焰圖也需要觸發。
$ java -jar arthas-boot.jar # 進入想要診斷的Java進程 $ jps $ dashbord # 觸發arthas fireline $ sc -d -t ./fireline $ profile demo.MathGame play $ exit
2. 查看火焰圖
觸發後,arthas會將火焰圖生成在當前目錄下。為了查看,我們可以使用瀏覽器打開它。
$ ls -l ./MathGame.play.dump ... $ google-chrome ./MathGame.play.dump
3. 對紅色函數進行分析
在火焰圖中,紅色是表示執行時間比較長的顏色。一般情況下,我們會通過紅色來找到整個應用中執行時間比較長的函數。
fireline(OUT): /path/to/xxx.java:22: cost 82 (- cost 39) in cn.demo.MathGame$PlayCmd.run algo-1.0.0-SNAPSHOT.jar: cn.demo.MathGame.handle(RpsCommand) algo-1.0.0-SNAPSHOT.jar: cn.demo.MathGame.handle(RpsCommand) ...
4. 對函數堆棧進行優化
如果我們想要查看函數的堆棧,可以通過命令 stack cn.demo.MathGame$PlayCmd.run
來獲取:
class: cn.demo.MathGame
method: run
cost: 105
size: 1.9M
start-time: 2021-10-11 17:53:34
arguments: "com.taobao.middleware.cli.RpsCommand"
stack:
(DONT SYNC) com.sun.tools.attach.VirtualMachineImpl.getSystemPropertiesNative line: not available [id=1]
(DONT SYNC) com.sun.tools.attach.VirtualMachineImpl.access$400 line: not available [id=1]
(DONT SYNC) com.sun.tools.attach.VirtualMachineImpl$1.run line: not available [id=1]
(DONT SYNC) java.security.AccessController.doPrivileged line: not available [id=2]
(DONT SYNC) com.sun.tools.attach.VirtualMachineImpl.attach line: not available [id=1]
(DONT SYNC) com.alibaba.arthas.boot.loader.ArthasClassloader.attach line: not available [id=1]
(DONT SYNC) com.alibaba.arthas.boot.AgentLauncher.attach line: not available [id=1]
(DONT SYNC) com.alibaba.arthas.boot.AgentLauncher.launch line: not available [id=1]
(SYNC-ING) com.alibaba.arthas.boot.AgentLauncher.premain line: not available
...我們可以通過代碼和函數堆棧來優化代碼。
五、arthas火焰圖的優勢
1. 易用性高
arthas火焰圖非常容易使用。在控制台中輸入一些簡單的命令就可以創建、查看和分析火焰圖。
2. 可視化的效果
arthas火焰圖非常容易讀取和分析。它提供了可視化的效果,使診斷問題變得更加容易和直觀。
3. 對JVM和應用的支持
arthas不僅僅支持JVM的診斷,還支持應用的診斷。這一點可以極大地提高應用程序的效率和可靠性。
4. 可擴展性高
arthas是開源的,因此具有高度可擴展性。開發人員可以很容易地改進和擴展它的功能。
六、結論
arthas火焰圖是一種非常有用的Java診斷工具,可以大幅度提高Java代碼的診斷效率。本文介紹了arthas火焰圖的生成、閱讀和使用,並且闡述了它的優點。我們相信,通過學習arthas火焰圖,Java程序員們可以更加輕鬆地解決問題,提高應用程序的效率和可靠性。
原創文章,作者:RWZJH,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/372251.html