1. 程式人生 > >Java線上問題排查神器Arthas快速上手與原理淺談

Java線上問題排查神器Arthas快速上手與原理淺談

![](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