早就聽聞阿里開源的 Arthas 在做 Java 應(yīng)用診斷上十分牛逼,沒(méi)失望
來(lái)源 | https://jitwxs.cn/a64edcb1.html
早就聽聞阿里開源的 Arthas 在做 Java 應(yīng)用診斷上十分牛逼,身邊也有很多同事在使用,因此決定開一個(gè)坑,自己從零學(xué)習(xí)下這個(gè)工具的使用,本系列使用的版本是當(dāng)前最新版 3.4.5。
由于 Arthas 經(jīng)過(guò)這么長(zhǎng)時(shí)間的發(fā)展,本身文檔、在線教程已經(jīng)十分健全了,同時(shí)還有第三方的 IDEA 插件、許多教學(xué)視頻去幫助我們?nèi)腴T使用,因此這個(gè)系列的文章定位是個(gè)人筆記,而并非教程,希望不要誤人子弟。
概述
https://arthas.aliyun.com
當(dāng)你遇到以下類似問(wèn)題而束手無(wú)策時(shí),Arthas可以幫助你解決:
這個(gè)類從哪個(gè) jar 包加載的?為什么會(huì)報(bào)各種類相關(guān)的 Exception? 我改的代碼為什么沒(méi)有執(zhí)行到?難道是我沒(méi) commit?分支搞錯(cuò)了? 遇到問(wèn)題無(wú)法在線上 debug,難道只能通過(guò)加日志再重新發(fā)布嗎? 線上遇到某個(gè)用戶的數(shù)據(jù)處理有問(wèn)題,但線上同樣無(wú)法 debug,線下無(wú)法重現(xiàn)! 是否有一個(gè)全局視角來(lái)查看系統(tǒng)的運(yùn)行狀況? 有什么辦法可以監(jiān)控到JVM的實(shí)時(shí)運(yùn)行狀態(tài)? 怎么快速定位應(yīng)用的熱點(diǎn),生成火焰圖? 使用 Arthas 需要 JDK 版本在 1.6 以上。
快速安裝
https://arthas.aliyun.com/doc/install-detail.html
Arthas 本身也是個(gè) Java 進(jìn)程,得益于 Java 跨平臺(tái)特性,所以我就直接在 Windows 上安裝了。
(1)下載 Arthas 包
curl -O https://arthas.aliyun.com/arthas-boot.jar(2)運(yùn)行 Arthas
java -jar arthas-boot.jar需要注意的是運(yùn)行 Arthas 前至少保證系統(tǒng)正在運(yùn)行一個(gè) Java 進(jìn)程,否則無(wú)法啟動(dòng),并會(huì)報(bào)錯(cuò):Can not find java process. Try to pass in command line.Please select an available pid。解決辦法就是跑一個(gè) Java 應(yīng)用即可。
如果需要卸載 Arthas 的話:
在 Linux/Unix/Mac 平臺(tái),刪除下面文件:
rm -rf ~/.arthas/
rm -rf ~/logs/arthasWindows平臺(tái)直接刪除user home下面的.arthas和logs/arthas目錄
快速入門
4.1 attach 進(jìn)程
這里我們使用 Arthas 官方提供的 demo 包,這樣我們就不需要自己編寫代碼了。將 demo 包下載下來(lái)并運(yùn)行。
curl -O https://arthas.aliyun.com/arthas-demo.jar
java -jar arthas-demo.jar這個(gè) demo 功能是死循環(huán)做質(zhì)因數(shù)分解,并記錄下無(wú)法分解的次數(shù),如下圖所示。
我們首先啟動(dòng) Arthas 并 attach 上該進(jìn)程。
默認(rèn)情況下,Arthas只listen 127.0.0.1,所以如果想從遠(yuǎn)程連接,則可以使用 --target-ip參數(shù)指定 listen 的IP
另外如果條件允許的話,在 attach 后也可以使用瀏覽器登錄,訪問(wèn):http://127.0.0.1:3658 即可。也可以填入 IP,遠(yuǎn)程連接其他機(jī)器的 Arthas。
4.2 常用命令
4.2.1 dashboard
https://arthas.aliyun.com/doc/dashboard.html
使用 dastboard 命令可以查看 Java 進(jìn)程信息(定時(shí)刷新),如需退出使用 q 即可。它由如下四個(gè)部分組成:
第一部分是顯示JVM中運(yùn)行的所有線程:所在線程組,優(yōu)先級(jí),線程的狀態(tài),CPU的占用率,是否是后臺(tái)進(jìn)程等 第二部分顯示的JVM內(nèi)存的使用情況 第三部分顯示的是 GC 相關(guān)的信息 第四部分是操作系統(tǒng)的一些信息和Java版本號(hào) 4.2.2 thread
https://arthas.aliyun.com/doc/thread.html
使用 thread 命令可以查看當(dāng)前所有的線程信息。
并且可以通過(guò)追加 PID 的方式,查看具體某個(gè)線程的狀態(tài)。
4.2.3 jad
https://arthas.aliyun.com/doc/jad.html
使用 jad 命令可以反編譯 class 文件。
4.2.2 watch
https://arthas.aliyun.com/doc/watch.html
watch 命令可以監(jiān)控方法的入?yún)⒊鰠ⅲ?/p>
退出 Arthas
如果只是退出當(dāng)前的連接,可以用quit或者exit命令。Attach到目標(biāo)進(jìn)程上的 Arthas 還會(huì)繼續(xù)運(yùn)行,端口會(huì)保持開放,下次連接時(shí)可以直接連接上。
如果想完全退出arthas,可以執(zhí)行stop命令。
獲取更多優(yōu)質(zhì)文章,點(diǎn)擊關(guān)注
??????









