使用arthas命令redefine實現Java熱更新(推薦)
阿新 • • 發佈:2020-05-06
arthas 是一個 Java 開源診斷神器。
今天分享一個非常重要的命令 redefine
,主要作用是載入外部的 .class 檔案,用來替換 JVM 已經載入的類,總結起來就是實現了 Java 的熱更新。
redefine
在一下幾種情況中會失敗:1、增加了 field
;2、增加了 method
;3、替換正在執行的方法。
前兩個比較好理解,第三個意思就是這個方法必須結束之後才會被替換,如果有個方法開始執行之後就不會跳出,那麼這個方法所在的類是無法被替換的,類似無限迴圈的方法。
中間提到了將本地的 .class 檔案上傳到伺服器的技巧,個人沒有采用,如果是要熱更新,完全可以利用 mc 這個命令在服務端編譯更新後的程式碼,然後進行本地替換。
arthas命令redefine實現Java熱更新
程式碼
package com.fun; import com.fun.frame.SourceCode; import org.slf4j.Logger; import java.util.ArrayList; import java.util.List; public class Fun extends SourceCode { int[] ss = new int[1024]; public static Logger logger = getLogger(Fun.class); public static void main(String[] args) { List<Fun> funs = new ArrayList<>(); while (true) { Fun fun = new Fun(); funs.add(fun); sleep(3000); test(); output(funs.size()); } } public static void test() { logger.info("成功!!!"); } }
呼叫 test() 方法會列印日誌的,如果是該方法被其他地方呼叫,修改之後也會生效。
到此這篇關於使用arthas命令redefine實現Java熱更新(推薦)的文章就介紹到這了,更多相關arthas Java熱更新內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!