目錄
一、常用命令
二、常用系統(tǒng)命令
三、JVM相關(guān)命令?
四、class/classloader相關(guān)命令
五、高級命令
一、常用命令
1、dashboard 儀表板
第一部分是顯示JVM中運行的所有線程:所在線程組,優(yōu)先級,線程的狀態(tài),CPU的占用率,是否是后臺進程等
第二部分顯示的JVM內(nèi)存的使用情況
第三部分是操作系統(tǒng)的一些信息和Java版本號
2、通過 thread 命令來獲取線程信息
1、當(dāng)沒有參數(shù)時,顯示所有線程的信息
thread
2、展示當(dāng)前最忙的前3個線程并打印堆棧thread -n 3
3、顯示1號線程的運行堆棧thread 1
4、找出當(dāng)前阻塞其他線程的線程,有時候我們發(fā)現(xiàn)應(yīng)用卡住了, 通常是由于某個線程拿住了某個鎖, 并且其他線程都在等待這把鎖造成的。 為了排查這類問題, arthas提供了thread -b, 一鍵找出那個罪魁禍?zhǔn)住?/p>thread -b
5、指定采樣時間間隔,每過1000毫秒采樣,顯示最占時間的3個線程thread -i 1000 -n 3
6、查看處于等待狀態(tài)的線程thread --state WAITING
3、通過 jad 來反編譯獲取源碼
1、編譯java.lang.String
jad java.lang.String
2、反編繹時只顯示源代碼,默認(rèn)情況下,反編譯結(jié)果里會帶有ClassLoader信息,通過–source-only選項,可以只打印源代碼。方便和mc/redefine命令結(jié)合使用。jad --source-only demo.MathGame
3、反編譯指定的方法jad demo.MathGame main
4、watch監(jiān)視
watch demo.MathGame(監(jiān)視的包名和類名) primeFactors(監(jiān)視的方法) returnObj(監(jiān)視的返回值)
5、退出arthas
如果只是退出當(dāng)前的連接,可以用quit或者exit命令。Attach到目標(biāo)進程上的arthas還會繼續(xù)運行,端口會保持開放,下次連接時可以直接連接上。
如果想完全退出arthas,可以執(zhí)行stop命令。
二、常用系統(tǒng)命令
1、help 查看命令幫助信息
2、cat 打印文件內(nèi)容,和linux里的cat命令類似 注:漢字有亂碼的問題 如果沒有寫路徑,則顯示當(dāng)前目錄下的文件
3、grep 匹配查找,和linux里的grep命令類似,但它只能用于管道命令
4、pwd 返回當(dāng)前的工作目錄,和linux命令類似
5、cls 清空當(dāng)前屏幕區(qū)域
6、session 查看當(dāng)前會話的信息
7、reset 重置增強類,將被 Arthas 增強過的類全部還原,Arthas 服務(wù)端關(guān)閉時會重置所有增強過的類
8、version 輸出當(dāng)前目標(biāo) Java 進程所加載的 Arthas 版本號
9、history 打印命令歷史
10、quit 退出當(dāng)前 Arthas 客戶端,其他 Arthas 客戶端不受影響
11、stop 關(guān)閉 Arthas 服務(wù)端,所有 Arthas 客戶端全部退出
12、keymap Arthas快捷鍵列表及自定義快捷鍵
三、JVM相關(guān)命令?
1、sysprop:查看和修改JVM的系統(tǒng)屬性
# 查看所有屬性
sysprop
# 查看單個屬性,支持通過tab補全
sysprop java.version
# 修改單個屬性
sysprop user.country
sysprop user.country CN
2、sysenv:查看當(dāng)前JVM的環(huán)境屬性
# 查看所有屬性
sysenv
# 查看單個環(huán)境變量
sysenv USER
3、vmoption:查看,更新JVM診斷相關(guān)的參數(shù)
# 查看所有的選項
vmoption
# 查看指定的選項
vmoption PrintGCDetails
# 更新指定的選項
vmoption PrintGCDetails true
4、 getstatic:查看類的靜態(tài)屬性
getstatic 類名 屬性名
5、ognl:可替代上面getstatic命令
# 調(diào)用靜態(tài)函數(shù)
ognl '@java.lang.System@out.println("hello")'
# 獲取靜態(tài)類的靜態(tài)字段
ognl '@demo.MathGame@random'
# 執(zhí)行多行表達式,賦值給臨時變量,返回一個List
ognl '#value1=@System@getProperty("java.home"), #value2=@System@getProperty("java.runtime.name"), {#value1, #value2}
?四、class/classloader相關(guān)命令
1、sc:?查看JVM已加載的類信息
2、sm :查看已加載類的方法信息
參數(shù)名稱 | 參數(shù)說明 |
---|---|
class-pattern | 類名表達式匹配 |
method-pattern | 方法名表達式匹配 |
[d] | 展示每個方法的詳細(xì)信息 |
[E] | 開啟正則表達式匹配,默認(rèn)為通配符匹配 |
3、jad:反編譯指定已加載類的源碼。
參數(shù)名稱 | 參數(shù)說明 |
---|---|
class-pattern | 類名表達式匹配 |
[E] | 開啟正則表達式匹配,默認(rèn)為通配符匹配 |
4、mc:編譯.java文件生成.class
# 在內(nèi)存中編譯Hello.java為Hello.class
mc /root/Hello.java
# 可以通過-d命令指定輸出目錄
mc -d /root/bbb /root/Hello.java
5、redefine:加載外部的.class文件,redefine到JVM里
注意, redefine后的原來的類不能恢復(fù),redefine有可能失?。ū热缭黾恿诵碌膄ield),參考jdk本身的文檔。
? ? ? ? 1、reset命令對redefine的類無效。如果想重置,需要redefine原始的字節(jié)碼。
? ? ? ? 2、redefine命令和jad/watch/trace/monitor/tt等命令會沖突。執(zhí)行完redefine之后,如果 再執(zhí)行上面提到的命令,則會把redefine的字節(jié)碼重置。
? ? ? ? 3、不允許新增加field/method 正在跑的函數(shù),沒有退出不能生效
? ? ? ? 4、結(jié)合 jad/mc 命令使用?
????????????????# 1. 使用jad反編譯demo.MathGame輸出到/root/MathGame.java
????????????????????????jad --source-only demo.MathGame > /root/MathGame.java
????????????????#2.按上面的代碼編輯完畢以后,使用mc內(nèi)存中對新的代碼編譯
????????????????????????mc /root/MathGame.java -d /root
????????????????# 3.使用redefine命令加載新的字節(jié)碼
????????????????????????redefine /root/demo/MathGame.class
五、高級命令
1、dump:?將正在JVM中運行的程序的字節(jié)碼文件提取出來,保存在logs相應(yīng)的目錄下,不同的類加載器放在不同的目錄
參數(shù)名稱 | 參數(shù)說明 |
---|---|
class-pattern | 類名表達式匹配 |
[c:] | 類所屬 ClassLoader 的 hashcode |
[E] | 開啟正則表達式匹配,默認(rèn)為通配符匹配 |
# 把String類的字節(jié)碼文件保存到~/logs/arthas/classdump/目錄下
dump java.lang.String?
# 把demo包下所有的類的字節(jié)碼文件保存到~/logs/arthas/classdump/目錄下
dump demo.*
?
2、classloader:獲取類加載器的信息
默認(rèn)按類加載器的類型查看統(tǒng)計信息
classloader
按類加載器的實例查看統(tǒng)計信息,可以看到類加載的hashCodeclassloader -l
查看ClassLoader的繼承樹classloader -t
通過類加載器的hash,查看此類加載器實際所在的位置classloader -c 680f2737
使用ClassLoader去查找指定資源resource所在的位置classloader -c 680f2737 -r META-INF/MANIFEST.MF
使用ClassLoader去查找類的class文件所在的位置classloader -c 680f2737 -r java/lang/String.class
使用ClassLoader去加載類classloader -c 70dea4e --load java.lang.String
3、monitor:監(jiān)控指定類中方法的執(zhí)行情況
每5秒監(jiān)控一次,類demo.MathGame中primeFactors方法
monitor -c 5 demo.MathGame primeFactors
4、watch :觀察到指定方法的調(diào)用情況
class-pattern?? ?類名表達式匹配
method-pattern?? ?方法名表達式匹配
express?? ?觀察表達式
condition-express?? ?條件表達式
[b]?? ?在方法調(diào)用之前觀察 before
[e]?? ?在方法異常之后觀察 exception
[s]?? ?在方法返回之后觀察 success
[f]?? ?在方法結(jié)束之后(正常返回和異常返回)觀察 finish
[E]?? ?開啟正則表達式匹配,默認(rèn)為通配符匹配
[x:]?? ?指定輸出結(jié)果的屬性遍歷深度,默認(rèn)為 1
5、trace :方法調(diào)用耗時追蹤
trace函數(shù)指定類的指定方法
trace demo.MathGame run
如果方法調(diào)用的次數(shù)很多,那么可以用-n參數(shù)指定捕捉結(jié)果的次數(shù)。比如下面的例子里,捕捉到一次調(diào)用就退出命令。trace demo.MathGame run -n 1
默認(rèn)情況下,trace不會包含jdk里的函數(shù)調(diào)用,如果希望trace jdk里的函數(shù),需要顯式設(shè)置–skipJDKMethod false。trace --skipJDKMethod false demo.MathGame run
據(jù)調(diào)用耗時過濾,trace大于0.5ms的調(diào)用路徑trace demo.MathGame run '#cost > .5'
可以用正則表匹配路徑上的多個類和函數(shù),一定程度上達到多層trace的效果。trace -E com.test.ClassA|org.test.ClassB method1|method2|method3
?6、stack:查看方法調(diào)用鏈
獲取primeFactors的調(diào)用路徑
stack demo.MathGame primeFactors
條件表達式來過濾,第0個參數(shù)的值小于0,-n表示獲取2次stack demo.MathGame primeFactors 'params[0]<0' -n 2
據(jù)執(zhí)行時間來過濾,耗時大于0.5毫秒stack demo.MathGame primeFactors '#cost>0.5'
7、tt:查看方法的出入?yún)?shù)
tt的參數(shù) | 說明 |
---|---|
-t | 記錄某個方法在一個時間段中的調(diào)用 |
-l | 顯示所有已經(jīng)記錄的列表 |
-n 次數(shù) | 只記錄多少次 |
-s 表達式 | 搜索表達式 |
-i 索引號 | 查看指定索引號的詳細(xì)調(diào)用信息 |
-p | 重新調(diào)用指定的索引號時間碎片 |
記錄下當(dāng)前方法的每次調(diào)用環(huán)境現(xiàn)場。
tt -t demo.MathGame primeFactors?
8、options:全局開關(guān)
查看所有的options
options
獲取option的值
options json-format
設(shè)置指定的option,打開執(zhí)行結(jié)果存日志功能,輸入如下命令即可:文章來源:http://www.zghlxwxcb.cn/news/detail-472542.html
options save-result true文章來源地址http://www.zghlxwxcb.cn/news/detail-472542.html
到了這里,關(guān)于Arthas常用命令的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!