什麼是Arthas(阿爾薩斯)
-
阿里開源的Java診斷工具,它可以在運行時對Java應用程序進行動態診斷和調試
-
當你遇到以下類似問題而束手無策時,
Arthas
可以幫助你解決- 這個類從哪個 jar 包加載的?爲什麼會報各種類相關的 Exception?
- 我改的代碼爲什麼沒有執行到?難道是我沒 commit?分支搞錯了?
- 遇到問題無法在線上 debug,難道只能通過加日誌再重新發布嗎?
- 線上遇到某個用戶的數據處理有問題,但線上同樣無法 debug,線下無法重現!
- 是否有一個全局視角來查看系統的運行狀況?
- 有什麼辦法可以監控到 JVM 的實時運行狀態?
- 怎麼快速定位應用的熱點,生成火焰圖?
- 怎樣直接從 JVM 內查找某個類的實例?
-
地址
- github:https://github.com/alibaba/arthas
- 官網:https://arthas.aliyun.com/
- 版本:Arthas-3.6.9
環境說明
Arthas
支持 JDK 6+,支持 Linux/Mac/Windows,採用命令行交互模式,同時提供豐富的 Tab
自動補全功能,進一步方便進行問題的定位和診斷。
安裝&下載
方式一
curl -O https://arthas.aliyun.com/math-game.jar
java -jar math-game.jar
方式二
官網地址:https://arthas.aliyun.com/
注:啓動Arthas時監聽本機是否啓動java進程;由於本地沒有啓動java進程,所以啓動Arthas失敗,下面提示信息也說的很清楚了~
本地測試Arthas源碼包:https://cyb-data-backup.oss-cn-guangzhou.aliyuncs.com/java/Arthas/arthas-packaging-3.6.9-bin.zip
使用
- 運行日誌路徑
~/logs/arthas/arthas.log
-
退出 arthas
- 如果只是退出當前的連接,其他客戶端不受影響,可以用 quit或者exit命令
- 目標進程上的 arthas 還會繼續運行,端口保持開放,下次連接時執行
java -jar arthas-boot.jar
可以直接連接上 - 如果想完全退出 arthas,可以執行stop命令
- 生產環境中,推薦使用:stop
常用基礎命令實戰
- base64 - base64 編碼轉換,和 linux 裏的 base64 命令類似
- cat - 打印文件內容,和 linux 裏的 cat 命令類似
- cls - 清空當前屏幕區域
- echo - 打印參數,和 linux 裏的 echo 命令類似
- grep - 匹配查找,和 linux 裏的 grep 命令類似
- help - 查看命令幫助信息
- history - 打印命令歷史
- keymap - Arthas 快捷鍵列表及自定義快捷鍵
- pwd - 返回當前的工作目錄,和 linux 命令類似
- quit - 退出當前 Arthas 客戶端,其他 Arthas 客戶端不受影響
- reset - 重置增強類,將被 Arthas 增強過的類全部還原,Arthas 服務端關閉時會重置所有增強過的類
- session - 查看當前會話的信息
- stop - 關閉 Arthas 服務端,所有 Arthas 客戶端全部退出
- tee - 複製標準輸入到標準輸出和指定的文件,和 linux 裏的 tee 命令類似
- version - 輸出當前目標 Java 進程所加載的 Arthas 版本號
其他命令:https://arthas.aliyun.com/doc/commands.html
注:每個命令如何使用,直接點進去查看示例教程即可~
JVM命令實戰
- dashboard - 當前系統的實時數據面板
- getstatic - 查看類的靜態屬性
- heapdump - dump java heap, 類似 jmap 命令的 heap dump 功能
- jvm - 查看當前 JVM 的信息
- logger - 查看和修改 logger
- mbean - 查看 Mbean 的信息
- memory - 查看 JVM 的內存信息
- ognl - 執行 ognl 表達式
- perfcounter - 查看當前 JVM 的 Perf Counter 信息
- sysenv - 查看 JVM 的環境變量
- sysprop - 查看和修改 JVM 的系統屬性
- thread - 查看當前 JVM 的線程堆棧信息
- vmoption - 查看和修改 JVM 裏診斷相關的 option
- vmtool - 從 jvm 裏查詢對象,執行 forceGc
dashboard
字段 | 說明 |
---|---|
id | Java 級別的線程 ID |
name | 線程名稱 |
group | 線程組名稱 |
proirity | 線程優先級,1 ~ 10 之間的數字,越大優先級越高 |
state | 線程的狀態 |
cpu | 線程的 cpu 使用率 |
delta_time | 上次採樣之後線程運行增量 CPU 時間,數據格式爲秒 |
time | 線程運行總 CPU 時間,數據格式爲 分:秒 |
interupted | 當前線程是否中斷 |
daemon | 是否是 daemon 守護線程 |
字段 | 說明 |
---|---|
used | 當前使用了多少內存 |
total | 總共分配了多少內存 |
max | 最大使用了多少 |
usage | 使用比例 |
gc | 垃圾回收器 |
thread
參數說明
參數名稱 | 參數說明 |
---|---|
id | 線程 id |
[n:] | 指定最忙的前 N 個線程並打印堆棧 |
[b] | 找出當前阻塞其他線程的線程 |
[i <value> ] |
指定 cpu 使用率統計的採樣間隔,單位爲毫秒,默認值爲 200 |
[--all] | 顯示所有匹配的線程 |
heapdump
- 生成堆棧快照
heapdump/Users/chenyanbin/Desktop/1.hprof
class/classloader 相關
- classloader - 查看 classloader 的繼承樹,urls,類加載信息,使用 classloader 去 getResource
- dump - dump 已加載類的 byte code 到特定目錄
- jad - 反編譯指定已加載類的源碼
- mc - 內存編譯器,內存編譯
.java
文件爲.class
文件 - redefine - 加載外部的
.class
文件,redefine 到 JVM 裏 - retransform - 加載外部的
.class
文件,retransform 到 JVM 裏 - sc - 查看 JVM 已加載的類信息
- sm - 查看已加載類的方法信息