使用arthas命令redefine實(shí)現(xiàn)Java熱更新(推薦)
arthas 是一個 Java 開源診斷神器。
今天分享一個非常重要的命令 redefine ,主要作用是加載外部的 .class 文件,用來替換 JVM 已經(jīng)加載的類,總結(jié)起來就是實(shí)現(xiàn)了 Java 的熱更新。
redefine 在一下幾種情況中會失敗:1、增加了 field ;2、增加了 method ;3、替換正在運(yùn)行的方法。
前兩個比較好理解,第三個意思就是這個方法必須結(jié)束之后才會被替換,如果有個方法開始運(yùn)行之后就不會跳出,那么這個方法所在的類是無法被替換的,類似無限循環(huán)的方法。
中間提到了將本地的 .class 文件上傳到服務(wù)器的技巧,個人沒有采用,如果是要熱更新,完全可以利用 mc 這個命令在服務(wù)端編譯更新后的代碼,然后進(jìn)行本地替換。
arthas命令redefine實(shí)現(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("成功!!!");
}
}
調(diào)用 test() 方法會打印日志的,如果是該方法被其他地方調(diào)用,修改之后也會生效。
到此這篇關(guān)于使用arthas命令redefine實(shí)現(xiàn)Java熱更新(推薦)的文章就介紹到這了,更多相關(guān)arthas Java熱更新內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺析SpringBoot2底層注解@Conditional@ImportResource
這篇文章主要為大家介紹了SpringBoot2底層注解@Conditional@ImportResource的分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
淺析Java 常用的 4 種加密方式(MD5+Base64+SHA+BCrypt)
這篇文章主要介紹了Java 常用的 4 種加密方式(MD5+Base64+SHA+BCrypt),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-10-10
Java swing框架實(shí)現(xiàn)的貪吃蛇游戲完整示例
這篇文章主要介紹了Java swing框架實(shí)現(xiàn)的貪吃蛇游戲,結(jié)合完整實(shí)例形式分析了java使用swing框架結(jié)合awt圖形繪制實(shí)現(xiàn)貪吃蛇游戲的具體步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-12-12
springboot中縮短一個url鏈接的實(shí)現(xiàn)
縮短 URL 是現(xiàn)代應(yīng)用程序中常見的需求,通常用于減少長 URL 的長度,使其更易于分享,URL 縮短服務(wù)的核心思路是將長 URL 映射到一個唯一的短代碼,本文主要介紹了springboot中縮短一個url鏈接的實(shí)現(xiàn),感興趣的可以了解一下2024-09-09
SpringBoot整合Swagger Api自動生成文檔的實(shí)現(xiàn)
本文主要介紹了SpringBoot整合Swagger Api自動生成文檔的實(shí),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
Java中system.exit(0) 和 system.exit(1)區(qū)別
本文主要介紹了Java中system.exit(0) 和 system.exit(1)區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
基于Java代碼實(shí)現(xiàn)支付充值的通用流程
本文給大家分享一段java核心代碼實(shí)現(xiàn)支付充值的通用流程,非常不錯,具有參考借鑒價值,感興趣的朋友一起看看吧2016-05-05
IntelliJ?IDEA?2022.2最新版本激活教程(親測可用版)永久激活工具分享
Jetbrains官方發(fā)布了?IntelliJ?IDEA2022.2?正式版,每次大的版本更新,都會有較大的調(diào)整和優(yōu)化,除本次更新全面擁抱?Java?17?外,還有對IDE?UI界面,安全性,便捷性等都做了調(diào)整和優(yōu)化完善,用戶體驗(yàn)提升不少,相信后面會有不少小伙伴跟著更新2022-08-08

