使用Arthas實現JAVA熱更新


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熱更新局限總結:

  1. 函數參數格式不能修改,只能修改函數內部的邏輯
  2. 不能增加類的函數或變量
  3. 函數必須能夠退出,如果有函數在死循環中,無法執行更新類


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM