Arthas是阿里巴巴開源出來的一個針對java的工具,主要是針對java的問題進行診斷。
官網地址(下載安裝請看這里):https://alibaba.github.io/arthas/index.html
這個工具可以協助完成下面這些事情:
- 這個類是從哪個jar包加載而來的?
- 為什么會報各種類相關的Exception?
- 線上遇到問題無法debug好蛋疼,難道只能反復通過增加System.out或通過加日志再重新發布嗎?
- 線上的代碼為什么沒有執行到這里?是由於代碼沒有commit?還是搞錯了分支?
- 線上遇到某個用戶的數據處理有問題,但線上同樣無法 debug,線下無法重現。
- 是否有一個全局視角來查看系統的運行狀況?
- 有什么辦法可以監控到JVM的實時運行狀態?
Arthas采用命令行交互模式,同時提供豐富的Tab自動補全功能,進一步方便進行問題的定位和診斷。
arthas實現熱更新
1、啟動Arthas
java -jar arthas-boot.jar
或者
java -jar arthas-boot.jar XXX #進程的PID
2、然后選擇需要熱更新的JVM進程
一段啟動信息后,就進入了交互模式。
3、通過sc
查找需要修改的class的ClassLoader
$ sc -d *OAuthClient | grep classLoaderHash
classLoaderHash 452c5c14
4、再使用redefine命令重新加載新編譯好的OAuthClient.class
$ redefine -c 452c5c14 /tmp/OAuthClient.class redefine success, size: 1
注意:不允許新增加field/method,正在跑的函數,沒有退出不能生效
其他熱更新操作方法:
jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java mc /tmp/UserController.java -d /tmp redefine /tmp/com/example/demo/arthas/user/UserController.class
- jad命令反編譯,然后可以用其它編譯器,比如vim來修改源碼
- mc命令來內存編譯修改過的代碼
- 用redefine命令加載新的字節碼
JVM熱更新的局限
基於Attach機制實現的熱更新,更新類需要與原來的類在包名,類名,修飾符上完全一致,否則在classRedefine過程中會產生classname don't match 的異常。
例如顯示這樣的報錯:redefineClasses exception class redefinition failed: attempted to delete a method.
具體來說,JVM熱更新局限總結:
- 函數參數格式不能修改,只能修改函數內部的邏輯
- 不能增加類的函數或變量
- 函數必須能夠退出,如果有函數在死循環中,無法執行更新類