使用arthas命令redefine實現(xiàn)Java熱更新(推薦)
arthas 是一個 Java 開源診斷神器。
今天分享一個非常重要的命令 redefine ,主要作用是加載外部的 .class 文件,用來替換 JVM 已經加載的類,總結起來就是實現(xiàn)了 Java 的熱更新。
redefine 在一下幾種情況中會失?。?、增加了 field ;2、增加了 method ;3、替換正在運行的方法。
前兩個比較好理解,第三個意思就是這個方法必須結束之后才會被替換,如果有個方法開始運行之后就不會跳出,那么這個方法所在的類是無法被替換的,類似無限循環(huán)的方法。
中間提到了將本地的 .class 文件上傳到服務器的技巧,個人沒有采用,如果是要熱更新,完全可以利用 mc 這個命令在服務端編譯更新后的代碼,然后進行本地替換。
arthas命令redefine實現(xiàn)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實現(xiàn)Java熱更新(推薦)的文章就介紹到這了,更多相關arthas Java熱更新內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java基礎知識之ByteArrayOutputStream流的使用
這篇文章主要介紹了Java基礎知識之ByteArrayOutputStream流的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
關于PreparedStatement的setObject作用及說明
這篇文章主要介紹了關于PreparedStatement的setObject作用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
Intellij IDEA命令行執(zhí)行java無法加載主類解決方案
這篇文章主要介紹了Intellij IDEA命令行執(zhí)行java無法加載主類解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09

