您好,登錄后才能下訂單哦!
本篇內容介紹了“java的Arthas命令有哪些”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
Arthas 是Alibaba開源的Java診斷工具,深受開發者喜愛(截止2020.9.19 github star是23K)。通過Arthas我們可以在線排查問題,無需重啟;動態跟蹤Java代碼;實時監控JVM狀態。
實時查看系統的運行狀況
查看函數調用的參數,返回值和異常
代碼在線熱更新
秒解類沖突問題,定位類加載路徑
快速定位應用的熱點,生成火焰圖
在線診斷,點開網頁診斷線上應用
當你遇到以下類似問題而束手無策時,Arthas可以幫助你解決:
這個類從哪個 jar 包加載的?為什么會報各種類相關的 Exception?
我改的代碼為什么沒有執行到?難道是我沒 commit?分支搞錯了?
遇到問題無法在線上 debug,難道只能通過加日志再重新發布嗎?
線上遇到某個用戶的數據處理有問題,但線上同樣無法 debug,線下無法重現!
是否有一個全局視角來查看系統的運行狀況?
有什么辦法可以監控到JVM的實時運行狀態?
怎么快速定位應用的熱點,生成火焰圖?
下載arthas-boot.jar,然后用java -jar的方式啟動:
curl -O https://arthas.aliyun.com/arthas-boot.jar java -jar arthas-boot.jar
本文的示例項目是運行在docker,因此就采用了另外的方式
docker exec -it ${containerId} /bin/bash -c "wget https://arthas.aliyun.com/arthas-boot.jar && java -jar arthas-boot.jar"
不過在執行的過程中,可能會出現
/bin/bash: wget: command not found
解決方案如下
進入容器的/bin/bash docker exec -it ${containerId} /bin/bash apt-get update apt-get install wget
help(查看命令幫助信息)
會列這個命令,源于個人習慣吧。每當學習一個新東西,都會習慣看下幫助,通讀一下 當你想了解具體命令的詳細用法,以thread為例,輸入
help thread
就會有詳細的thread參數、例子介紹。感覺本文的精華就是這個了,畢竟你想要其他命令,直接
help 命令
但為了水文,就再介紹幾類命令
dashboard(實時展示當前系統諸如線程、內存占用、GC等信息的面板,默認每個5秒刷新一下面板)
注:按ctrl+c可以退出面板
jvm(查看當前JVM信息比如gc回收次數以及耗時等)
thread(查看當前線程信息,查看線程的堆棧)
a、 查看當前最忙的前N個線程并打印堆棧
thread -n 3
上述的命令實現的效果就和我們以往輸入
top -H -p pid printf '%x\n'pid jstack pid |grep 'nid' -C5 –color
類似
b、 thread -b, 找出當前阻塞其他線程的線程
注: 目前只支持找出synchronized關鍵字阻塞住的線程, 如果是java.util.concurrent.Lock, 目前還不支持
c、 thread --state ,查看指定狀態的線程
logger(查看logger信息,更新logger level)
3.1、 查看logger信息 3.2、 動態更新logger level
修改日志級別步驟
a、 查找當前類的classloader hashcode
sc -d com.example.springdemo.user.service.impl.UserServiceImpl | grep classLoaderHash
b、 用OGNL獲取logger
ognl -c 31cefde0 '@com.example.springdemo.user.service.impl.UserServiceImpl@log'
從上圖可以知道com.example.springdemo.user.service.impl.UserServiceImpl@log實際使用的是logback。 可以看到level=null,則說明實際最終的level是從root logger里來的。
c、 單獨設置UserServiceImpl的logger level 把日志級別變更為warn
ognl -c 31cefde0 '@com.example.springdemo.user.service.impl.UserServiceImpl@log.setLevel(@ch.qos.logback.classic.Level@WARN)'
可以看出日志級別已經改為warn
jad(反編譯指定已加載類的源碼)
sc(查看JVM已加載的類信息)
mc(內存編譯器,編譯.java文件生成.class)
redefine(加載外部的.class文件,redefine jvm已加載的類)
為啥介紹這幾個,因為這幾個組合起來就可以實現動態在線更新代碼了。其步驟如下
a、jad反編譯要更新的代碼
jad --source-only com.example.springdemo.user.service.impl.UserServiceImpl > /tmp/UserServiceImpl.java
b、sc查找加載要更新代碼的ClassLoader
sc -d com.example.springdemo.user.service.impl.UserServiceImpl | grep classLoaderHash
c、保存好/tmp/UserServiceImpl.java之后,使用mc(Memory Compiler)命令來編譯,并且通過--classLoaderClass參數指定ClassLoader
mc --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader /tmp/UserServiceImpl.java -d /tmp
d、使用redefine命令重新加載新編譯好的UserServiceImpl.class
redefine /tmp/com/example/springdemo/user/service/impl/UserServiceImpl.class
monitor(方法執行監控,可以監控方法的調用次數、成功次數、失敗次數、平均響應時間、失敗率)
注: 這是一個非實時返回命令,統計周期,默認值為120秒
monitor -c 5 com.example.springdemo.user.service.impl.UserServiceImpl getUserById
watch(觀察指定方法的調用情況。能觀察到的范圍為:返回值、拋出異常、入參)
watch com.example.springdemo.user.service.impl.UserServiceImpl getUserById "{params,returnObj}" -x 2
watch參數說明
trace(方法內部調用路徑,并輸出方法路徑上的每個節點上耗時)
注: trace 能方便的幫助你定位和發現因 RT 高而導致的性能問題缺陷,但其每次只能跟蹤一級方法的調用鏈路。
trace com.example.springdemo.user.service.impl.UserServiceImpl getUserById
stack(輸出當前方法被調用的調用路徑)
stack com.example.springdemo.user.service.impl.UserServiceImpl getUserById
tt(方法執行數據的時空隧道,記錄下指定方法每次調用的入參和返回信息,并能對這些不同的時間下調用進行觀測)
這個命令的厲害之處在于記錄下當前方法的每次調用環境現場,并能進行重放
tt -t com.example.springdemo.user.service.impl.UserServiceImpl getUserById
b、選擇一個index進行重放
tt -i 1000 -p
注:這些監控命令,都通過字節碼增強技術來實現的,會在指定類的方法中插入一些切面來實現數據統計和觀測,因此在線上、預發使用時,請盡量明確需要觀測的類、方法以及條件,診斷結束要執行 stop 或將增強過的類執行 reset 命令。
“java的Arthas命令有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。