Java線上問題排查神器Arthas快速上手與原理淺談
阿新 • • 發佈:2020-08-26
![](https://user-gold-cdn.xitu.io/2019/11/17/16e777302495aab9?w=1324&h=891&f=png&s=924323)
# 前言
當你興沖沖地開始執行自己的Java專案時,你是否遇到過如下問題:
- 程式在穩定運行了,可是實現的功能點了沒反應。
- 為了修復Bug而上線的新版本,上線後發現Bug依然在,卻想不通哪裡有問題?
- 想到可能出現問題的地方,卻發現那裡沒打日誌,沒法在執行中看到問題,只能加了日誌輸出重新打包——部署——上線
- 程式功能正常了,可是為啥響應時間這麼慢,在哪裡出現了問題?
- 程式不但穩定執行,而且功能完美,但跑了幾天或者幾周過後,發現響應速度變慢了,是不是記憶體洩漏了?
**以前,你碰到這些問題,解決的辦法大多是,修改程式碼,重新上線。但是在大公司裡,上線的流程是非常繁瑣的,如果為了多加一行日誌而重新發布版本,無疑是非常折騰人的。**
現在,我們有了更為優雅的線上除錯方法,來自阿里巴巴開源的Arthas
下圖是Arthas文件中對於為什麼要使用它的描述,我進行了精簡:
![](https://user-gold-cdn.xitu.io/2019/11/17/16e77733de5cbff0?w=1210&h=824&f=png&s=800949)
好了,前言已經超過字數了,哈哈,在本篇文章裡,你能夠了解:
- Arthas使用例項:幫助你快速讓你上手,拯救你的低效率Debug
- 使用Arthas解決具體問題:看一下Arthas幫我拯救了多少時間
- 相似工具:看看線上Debug還有沒有別的工具可以使用
- 原理淺談:莫在浮沙築高閣!你需要大概瞭解下Arthas的原理
**相信我,Arhas覺得是你提升效率的利器,適合各種階段的開發者,尤其適合我這種剛入門的新人(天天上班寫Bug的人)。你不應該有這種東西是高階程式設計師才應該去使用的思想,放心大膽的去用吧**
(打廣告時間,更多精彩文章,請關注公眾號:**後端技術漫談**)
# 線上Debug神器Arthas
## Arthas使用例項
命令的詳細文件請參考:
https://alibaba.github.io/arthas/commands.html
### 快速啟動
快速啟動它,你只需要兩行命令:
```
wget https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar
```
![](https://user-gold-cdn.xitu.io/2019/11/17/16e7773796be31d5?w=1331&h=721&f=png&s=32310)
隨後,在介面出現的程序中,選擇你的程式序號,比如1
![](https://user-gold-cdn.xitu.io/2019/11/17/16e7773b246590e1?w=1278&h=637&f=png&s=73674)
這樣你就進入了arthas的控制檯
### 基本使用
**Arthas有如下功能:**
![](https://user-gold-cdn.xitu.io/2019/11/17/16e7773eb62820e7?w=1204&h=818&f=png&s=868762)
**1. 首先是我認為的“上帝視角”指令:Dashboard**
> 當前系統的實時資料面板,按 ctrl+c 退出。
> 當執行在Ali-tomcat時,會顯示當前tomcat的實時資訊,如HTTP請求的qps, rt, 錯誤數, 執行緒池資訊等等。
通過這些,你可以對於整個程式程序有個直觀的資料監控。
![](https://user-gold-cdn.xitu.io/2019/11/17/16e777454d67c0ed?w=972&h=636&f=png&s=421846)
![](https://user-gold-cdn.xitu.io/2019/11/17/16e777489e6d1ca1?w=1118&h=864&f=png&s=611476)
**2. 類載入問題相關指令**
![](https://user-gold-cdn.xitu.io/2019/11/17/16e7774b71409630?w=973&h=632&f=png&s=422377)
**SC:檢視JVM已載入的類資訊**
通過SC我們可以看到我們這個類的詳細資訊,包括是從哪個jar包讀取的,他是不是介面/列舉類等,甚至包括他是從哪個類載入器載入的。
![](https://user-gold-cdn.xitu.io/2019/11/17/16e7774e36af122f?w=1120&h=872&f=png&s=340510)
上圖中程式碼:
```
[arthas@37]$ sc -d *MathGame
class-info demo.MathGame
code-source /home/scrapbook/tutorial/arthas-demo.jar
name demo.MathGame
isInterface false
isAnnotation false
isEnum false
isAnonymousClass false
isArray false
isLocalClass false
isMemberClass false
isPrimitive false
isSynthetic false
simple-name MathGame
modifier public
annotation
interfaces
super-class +-java.lang.Object
class-loader +-sun.misc.Launcher$AppClassLoader@70dea4e
+-sun.misc.Launcher$ExtClassLoader@69260973
classLoaderHash 70dea4e
```
SC也可以檢視已載入的類,幫助你看是否有沒有納入進來的類,尤其是在Spring中,可以判斷的你的依賴有沒有正確的進來。
![](https://user-gold-cdn.xitu.io/2019/11/17/16e77751eaeb3554?w=1154&h=896&f=png&s=483064)
上圖中程式碼:
```
# 檢視JVM已載入的類資訊
[arthas@37]$ sc javax.servlet.Filter
com.example.demo.arthas.AdminFilterConfig$AdminFilter
javax.servlet.Filter
org.apache.tomcat.websocket.server.WsFilter
org.springframework.boot.web.filter.OrderedCharacterEncodingFilter
org.springframework.boot.web.filter.OrderedHiddenHttpMethodFilter
org.springframework.boot.web.filter.OrderedHttpPutFormContentFilter
org.springframework.boot.web.filter.OrderedRequestContextFilter
org.springframework.web.filter.CharacterEncodingFilter
org.springframework.web.filter.GenericFilterBean
org.springframework.web.filter.HiddenHttpMethodFilter
org.springframework.web.filter.HttpPutFormContentFilter
org.springframework.web.filter.OncePerRequestFilter
org.springframework.web.filter.RequestContextFilter
org.springframework.web.servlet.resource.ResourceUrlEncodingFilter
Affect(row-cnt:14) cost in 11 ms.
# 檢視已載入類的方法資訊
[arthas@37]$ sm java.math.RoundingMode
java.math.Round