日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

进行判断使用class_记一次使用 Arthas 热更新线上代码

發布時間:2025/3/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 进行判断使用class_记一次使用 Arthas 热更新线上代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

引用參考第二條 - Arthas提醒您: 診斷千萬條,規范第一條,熱更不規范,同事兩行淚

起因

在一次迭代中,出現了一個低級錯誤,if 語句中的判斷邏輯出現了錯誤,剛好這個功能場景在開發和測試過程中很少觸發,使用的用戶也不多,不過的確影響到了少部分用戶,所以還是需要進行修復。

想著只是更新一行代碼,如果走正常的發布流程,需要通過以下步驟:

提交代碼 -> 提測打包 -> 測試環境git驗證 -> Release 環境驗證 -> 預發環境驗證 -> 線上環境

如果你的應用體積不小,而且線上機器很多,花費的時間可能足夠喝很多杯 Java :-O


Arthas

之前使用過 Alibaba 開源的診斷工具 Arthas ,下圖是官方文檔中提到的功能:

不僅可以用來排查問題,還能夠使用它 redefine 進行熱更新。

剛好之前也看到一篇文章介紹如何進行 一條龍更新,所以就開始了嘗試,先從本地開發測試開始。


選擇方案

方案一:jad/mc/redefine線上熱更新一條龍

開發時寫下的 java 程序是高級語言,需要通過編譯生成 .class 文件才能在 jvm 中運行。

所以在一個運行中的程序中進行熱更新,需要先將它使用 jad [Java decompile]反編譯,修改 .java 文件后使用 mc [Memory complile] 編譯出 .class 文件,最后使用 redefine 命令更新虛擬機中的程序。

首先可以跟著教程來一次嘗試 https://alibaba.github.io/arthas/arthas-tutorials?language=cn&id=arthas-advanced

# 反編譯$ jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java# 修改文件$ vim /tmp/UserController.java# 查找加載的 ClassLoader$ $ sc -d *UserController | grep classLoaderHash classLoaderHash 6bc28484# 編譯$ mc -c 6bc28484 /tmp/UserController.java -d /tmp# 熱更新$ redefine /tmp/com/example/demo/arthas/user/UserController.classredefine success, size: 1# 反編譯$ jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java# 修改文件$ vim /tmp/UserController.java# 查找加載的 ClassLoader$ $ sc -d *UserController | grep classLoaderHash classLoaderHash 6bc28484# 編譯$ mc -c 6bc28484 /tmp/UserController.java -d /tmp# 熱更新$ redefine /tmp/com/example/demo/arthas/user/UserController.classredefine success, size: 1

跟著教程 demo,發現代碼邏輯被修改,返回我修改后的結果,心里在狂喜,可以不用喝這些多咖啡!


實際項目中反編譯失敗

但在工作中的項目中使用,發現出現了這個問題:反編譯后的類不完整

查看通過 jad 命令反編譯后的文件:

/* * Decompiled with CFR. * * Could not load the following classes: * .... */

在不完整的文件中進行修改后,進行 mc 命令編譯,將會提示如下:

[arthas@7281]$ mc -c 6bc28484 /tmp/xxxx.java -d /tmpMemory compiler error, exception message: Compilation Error......, please check $HOME/logs/arthas/arthas.log for more details.Affect(row-cnt:0) cost in 884 ms.

可以看到,如果有復雜的類,并一定能夠成功反編譯,遭遇了失敗,開始排查原因


反編譯失敗原因

開源的好處的是,大家可以一起參與到其中,提出問題和解決問題,在 github 項目 arthas 的 issue 中,通過關鍵字 jad 反編譯 找到了原因

橫云斷嶺 Arthas源碼分析–jad反編譯原理:

可能好巧不巧,實際項目中的代碼,就遇上了這 1% 情況(順便看了其它類,發現這種情況還不少…)

當時對于 jad 機制是有點不了解,所以想先通過上面的提示的工具 dumpclass 去精確獲取 java 字節碼,但奈何有些難用,嘗試了幾遍還是沒能拿下來,于是開始換種思路。


方案二:直接拿到 .class 文件

既然前面的操作,獲取修改后的 .class 文件,都是為了最后一步 redefine 所服務,那只要獲取精確的 .class 文件就可以了,跳過前面的步驟也可以。

于是與一個前輩討論后,他建議我使用 IDEA 工具編譯后的 .class 文件

于是將本地代碼進行修改,進行打包編譯,得到想要的 .class 文件,然后將這個文件上傳到測試環境,進行替換。

文件地址類似下圖:

[arthas@63]$ redefine /tmp/xxxxxx.classredefine success, size: 1

出現了成功的提示,同時進行了接口測試,發現執行的代碼是修改后的邏輯!


總結

通過上面說的,正常來說只需要簡單四步就能進行熱更新

一、使用 jad 反編譯出 .java 文件

二、編輯文件,修改邏輯

三、使用 mc 編譯修改后的文件

四、使用 redefine 熱更新

當然,也可能遇到 jad 反編譯失敗的場景,可以參考方案二,直接拿到修改后的 .class 文件,然后繼續進行操作。


題外話

標題最后一個字為什么叫【誤】呢,是因為我經過測試,跟前輩們討論后,在發布流程規范、 IDEA 提供的 .class 文件不確定性還有工具誤用的把控上考慮,覺得目前不適合使用,于是還是走了正常的發布流程。

最后,Arthas提醒您: 診斷千萬條,規范第一條,熱更不規范,同事兩行淚

以后要避免再犯這些小錯誤,恩,換言之,我喝了很多杯 Java :-(


參考資料

  • Arthas 用戶文檔
  • jad/mc/redefine線上熱更新一條龍
  • 橫云斷嶺 Arthas源碼分析–jad反編譯原理
  • 總結

    以上是生活随笔為你收集整理的进行判断使用class_记一次使用 Arthas 热更新线上代码的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。