Arthas
-
它是什么?
Arthas
是Alibaba開源的Java診斷工具,深受開發者喜愛。 -
它能解決什么問題?
-
我想看一下jvm當前的運行狀態,怎么看?
-
系統CPU跑到300%,怎么定位問題?
-
接口頻繁超時,如何精准定位問題?
-
如何查看當前正在執行的源碼?
-
小程序對接,看不到接口的返回值,怎么辦?
-
線上發現代碼出bug了,但是這時候無法緊急發版,怎么辦?
-
如何在不發版的情況下更新日志級別?
..........
-
-
如何使用?
快速安裝
使用arthas-boot
(推薦)
下載arthas-boot.jar
,然后用java -jar
的方式啟動:
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
打印幫助信息:
java -jar arthas-boot.jar -h
卸載
-
在 Linux/Unix/Mac 平台
刪除下面文件:
rm -rf ~/.arthas/
rm -rf ~/logs/arthas -
Windows平台直接刪除user home下面的
.arthas
和logs/arthas
目錄
dashboard
查看當前系統的實時數據面板,按
ctrl+c
退出
參數說明
參數名稱 | 參數說明 |
---|---|
[i:] | 刷新實時數據的時間間隔 (ms),默認5000ms |
[n:] | 刷新實時數據的次數 |
截圖展示
數據說明:
-
thread:
-
ID: Java級別的線程ID,注意這個ID不能跟jstack中的nativeID一一對應。
-
NAME: 線程名
-
GROUP: 線程組名
-
PRIORITY: 線程優先級, 1~10之間的數字,越大表示優先級越高
-
STATE: 線程的狀態
-
CPU%: 線程的cpu使用率。比如采樣間隔1000ms,某個線程的增量cpu時間為100ms,則cpu使用率=100/1000=10%
-
DELTA_TIME: 上次采樣之后線程運行增量CPU時間,數據格式為
秒
-
TIME: 線程運行總CPU時間,數據格式為
分:秒
-
INTERRUPTED: 線程當前的中斷位狀態
-
DAEMON: 是否是daemon線程
-
-
memory:
-
heap
-
ps_eden_space:伊甸園
-
ps_survivor_space:幸存者區
-
ps_old_gen:老年代
-
-
nonheap
-
code_cache:代碼緩存區
-
metaspace:元空間
-
compressed_class_space:壓縮類空間
-
direct: Direct Memory,nio使用的堆外空間
-
mapped:內存映射文件,nio使用
-
-
-
GC:
-
gc.ps_scavenge.count:垃圾回收次數
-
gc.ps_scavenge.time(ms):垃圾回收消耗時間
-
gc.ps_marksweep.count:標記-清除算法的次數
-
gc.ps_marksweep.time(ms):標記-清除算法的消耗時間
-
-
Runtime: 當前系統參數
thread
查看當前線程信息,查看線程的堆棧
參數說明
參數名稱 | 參數說明 |
---|---|
id | 線程id |
[n:] | 指定最忙的前N個線程並打印堆棧 |
[b] | 找出當前阻塞其他線程的線程 |
[i <value> ] |
指定cpu使用率統計的采樣間隔,單位為毫秒,默認值為200 |
[--all] | 顯示所有匹配的線程 |
trace(線上環境高並發接口慎用)
方法內部調用路徑,並輸出方法路徑上的每個節點上耗時
使用方式: trace 全類名 方法名
jad
反編譯指定已加載類的源碼
使用方式: jad 全類名
watch(線上環境高並發接口慎用)
方法執行數據觀測
使用方式: watch 全類名 方法名
redefine(線上環境禁用)
熱更新線上代碼
通過
sc
查找需要修改的class的ClassLoadersc -d 全類名 | grep classLoaderHash
再使用redefine命令重新加載新編譯好的class文件
redefine -c classLoaderHash class文件地址
logger
修改線上日志級別
通過sc命令查看JVM已加載的類信息,拿到classLoaderHash
sc -d 全類名 | grep classLoaderHash
更新指定類日志級別
logger -c classLoaderHash --name 全類名 --level 日志等級