本帖最後由 Aquila 於 2023-7-14 16:31 編輯
Arthas(阿爾薩斯)是 Alibaba 開源的一款 Java 診斷工具,使用它我們可以監控和排查 Java 程序,然而它還提供了非常實用的 Java 熱更新功能。
所謂的 Java 熱更新是指在不重啟項目的情況下實現代碼的更新與替換。使用它可以實現不停機更新 Java 程序,尤其是對那些啟動非常耗時的 Java 項目來說,更是效果顯著。
Arthas 的使用其實非常簡單,它為我們提供了一個 Jar 包,我們只需要把這個 Jar 下載到本地,然後運行這個 Jar 包就可以正常使用它的功能了。
Arthas 功能簡述
當你遇到以下類似問題而束手無策時,Arthas 可以幫助你解決(來自官方):
這個類從哪個 jar 包加載的?為什麼會報各種類相關的 Exception?
我改的代碼為什麼沒有執行到?難道是我沒 commit?分支搞錯了?
遇到問題無法在線上 debug,難道只能通過加日誌再重新發布嗎?
線上遇到某個用戶的數據處理有問題,但線上同樣無法 debug,線下無法重現!
是否有一個全局視角來查看系統的運行狀況?
有什麼辦法可以監控到JVM的實時運行狀態?
怎麼快速定位應用的熱點,生成火焰圖?
Arthas 支持 JDK 6+,支持 Linux/Mac/Winodws,它採用命令行交互模式,同時提供豐富的 Tab 自動補全功能,進一步方便進行問題的定位和診斷。
Arthas 使用
Arthas 的使用步驟如下。
[hide]
步驟一:下載 Arthas
首先,我們先把 Arthas 的 Jar 包下載到本地
步驟二:啟動 Arthas
我們只需要使用普通的 jar 包啟動命令:java -jar arthas-boot.jar 來啟動 Arthas 即可,啟動成功之後的運行界面如下:

如上圖所示則表示 Arthas 啟動成功。
步驟三:運行 Arthas
當我們啟動完 Arthas 之後,根據上圖的提示,我們需要選擇一個要調試的 Java 進程,例如我們輸入“4”來監測我自己寫的一個 Java 測試程序,執行結果如下:

當出現 Arthas 的 logo 之後,表示 Arthas 正常加載了 Java 進程。
步驟四:操作 Arthas
當 Arthas 加載 Java 進程成功之後,我們就可以輸入相關的命令來查看相關的信息了。
假如我們把本地環境視為生產服務器,我們此時需要查看某個運行的 Java 程序是否為最新版的。
在沒有 Arthas 之前,我們通常的步驟是這樣的:
1.找到相應的 jar 包(或者 war 包);
2.將 jar 包(或者 war 包)下載到本地;
3.找出相應的類進行解壓操作;
4/然後將解壓的 class 文件拖拽到 Java 編譯器(Idea 或 Eclipse)中,查看是否為最新的代碼。
但如果使用的是 Arthas,那麼我們就可以直接通過反編譯命令,將字節碼編譯為正常的 Java 代碼,然後再確認是否為最新的代碼即可。我們只需要執行 jad 命令即可,實現示例如下:
這樣我們就可以直接來查看這個發布的程序是否為最新版本了。
不僅如此,我們還可以使用 Arthas 來監測整個程序的運行情況,如下圖所示:

我們還可以用 Arthas 來查看一些 JVM 的相關信息,如下圖所示:
熱更新 Java 代碼
假如我們原來的代碼是這樣的

我們現在想要把 flag 變量改為 false 就可以這樣來做:
1.使用 Arthas 的內存編譯工具將新的 Java 代碼編譯為字節碼;
2.使用 Arthas 的 redefine 命令實現熱更新。
1.編譯字節碼
首先,我們需要將新的 Java 代碼編譯為字節碼,我們可以通過 Arthas 提供的 mc 命令實現,mc 是 Memory Compiler(內存編譯器)的縮寫。
實現示例如下:
2.執行熱更新
有了字節碼文件之後,我們就可以使用 redefine 命令來實現熱更新了,實現示例如下:

從上述結果可以看出,熱更新執行成功,此時我們去控制台查看執行結果,如下圖所示:
開服請找▼▼▼▼▼
LINE: @406wgekr
線上客服提供服務項目:
1.商業版販售
2.售後服務
3.付費諮詢 2K/hr
另外誠徵有想法及能力的朋友歡迎加入我們
帖子等技術問題私訊給我
arthas.zip
(12.93 MB, 下載次數: 13, 售價: 299 金錢)
[hide]