成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一文搞定Java熱更新

開發 后端
在持續交付的時代,重新部署一個新的版本只需要點擊一下按鈕。但在有的情況下,重新部署過程可能比較復雜,停機是不被允許的。所以JVM提供了另外一種選擇:在不重啟應用的前提下進行小幅改動,又稱熱更新。

 Java熱更新

在持續交付的時代,重新部署一個新的版本只需要點擊一下按鈕。但在有的情況下,重新部署過程可能比較復雜,停機是不被允許的。所以JVM提供了另外一種選擇:在不重啟應用的前提下進行小幅改動,又稱熱更新。

[[277524]]

對于某些大型的應用來說,每次的重啟都需要花費大量的時間成本,所以,如果能在不重啟虛擬機的情況下更新一個類,在某些業務場景下變得十分重要。比如很多腳本語言就支持熱替換,例如服務器端PHP,只要替換了PHP源文件,這種改動就會立即生效,無需重啟服務器。

在Java開發領域,熱更新一直是一個難以解決的問題,目前的Java虛擬機只能實現方法級別的熱更新,對于整個類的結構修改,仍然需要重啟虛擬機。

熱更新的方法

Java熱更新一直不斷地改進。

1.4開始JPDA引入了hotSwap機制(JPDA Enhancements),實現了debug時的method body的動態性。

1.5開始通過JVMTI實現的java.lang.instrument(Java Platform SE 8)的premain方式,實現了agent方式的動態性(JVM啟動時指定agent)。

1.6增加了agentmain方式,實現了運行時動態性(通過The Attach API 綁定到具體VM)。其基本實現是通過JVMTI的retransformClass/redefineClass進行函數體級別的字節碼更新,ASM、CGLib之類基本都是圍繞這些在做動態性。

1.定義不同的classloader

在了解JVM ClassLoader之后(可以點擊查看《Java類加載及對象創建過程詳解》),可以通過定義不同的ClassLoader,監聽文件變化后,通過新的ClassLoader加載新文件,然后做好相應的狀態恢復,對舊ClassLoader進行卸載等動作。(舊classloader及加載的class類在沒有實例引用的情況下,full gc時會被回收掉)

Tomcat的動態部署就是監聽war變化,然后調用StandardContext.reload(),用新的WebContextClassLoader實例來加載war,然后初始化servlet來實現。類似的實現還有OSGi等。

這種熱更新的流程如下:

一文搞定Java熱更新

重新加載類的過程

2.agentmain

筆者的項目目前采用的這種形式,雖然筆者造過好多輪子,但筆者更看好Arthas這樣的開源產品。。。

agentmain熱更新的原理

為了實現Java進程A與進程B之間的本地通信,熱更新的JVM進程使用VirutalMachine.attach(pid)來連接需要熱更新的JVM進程,然后使用virtualMachine.loadAgent加載自定義的agent(筆者查看了Arthas源碼,原理也大致相同)。這個通信通道成功建立之后,那么進程A就能通知進程B去執行某些操作,從而達到監控進程B或者控制進程B的某些行為的目的。如jstack、jmap等JDK自帶的工具,基本都是通過Attach機制去達成各自想要的目的的。

JVM啟動的時候,在JVM內部啟動了一個監聽線程,這個線程的名字叫“Signal Dispatcher”,該線程的作用是,監聽并處理OS的信號。

信號是一種進程通信。如平常我們用的最多的就是 kill -9 ${pid}來殺死某個進程,kill進程通過向${pid}的進程發送一個編號為“9”號的信號,來通知系統強制結束${pid}的生命周期。)

至于attach實現,在Linux下時使用文件Socket進行進程通信(對同一個文件進行讀寫操作,以達到信息的交互和共享)。

更詳細的原理,JVM大神寒泉子有篇文章《JVM源碼分析之javaagent原理完全解讀》,如點擊無法跳轉,請查看筆者CSDN博客原文來點擊超鏈接。

3.Arthas

Arthas是阿里巴巴最近開源出來的一個針對java的工具,主要是針對java的問題進行診斷。

跳轉官網地址

這個工具可以協助完成下面這些事情(轉自官網):

  1. 這個類是從哪個jar包加載而來的?
  2. 為什么會報各種類相關的Exception?
  3. 線上遇到問題無法debug好蛋疼,難道只能反復通過增加System.out或通過加日志再重新發布嗎?
  4. 線上的代碼為什么沒有執行到這里?是由于代碼沒有commit?還是搞錯了分支?
  5. 線上遇到某個用戶的數據處理有問題,但線上同樣無法 debug,線下無法重現。
  6. 是否有一個全局視角來查看系統的運行狀況?
  7. 有什么辦法可以監控到JVM的實時運行狀態?

Arthas采用命令行交互模式,同時提供豐富的Tab自動補全功能,進一步方便進行問題的定位和診斷。

Arthas提供在線教程,相比一般的開源產品,上手真的很贊。

arthas實現熱更新

使用Arthas三個命令就可以搞定熱更新

  1. jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java 
  2. mc /tmp/UserController.java -d /tmp 
  3. redefine /tmp/com/example/demo/arthas/user/UserController.class 
  1. jad命令反編譯,然后可以用其它編譯器,比如vim來修改源碼
  2. mc命令來內存編譯修改過的代碼
  3. 用redefine命令加載新的字節碼

JVM熱更新的局限

基于Attach機制實現的熱更新,更新類需要與原來的類在包名,類名,修飾符上完全一致,否則在classRedefine過程中會產生classname don't match 的異常。

例如顯示這樣的報錯:redefineClasses exception class redefinition failed: attempted to delete a method.

具體來說,JVM熱更新局限總結:

  1. 函數參數格式不能修改,只能修改函數內部的邏輯
  2. 不能增加類的函數或變量
  3. 函數必須能夠退出,如果有函數在死循環中,無法執行更新類(筆者實驗發現,死循環跳出之后,再執行類的時候,才會是更新類)

最后,限于筆者經驗水平有限,歡迎讀者就文中的觀點提出寶貴的建議和意見。

責任編輯:華軒 來源: 今日頭條
相關推薦

2024-01-09 08:24:47

JMM核心線程

2021-03-28 18:40:02

LinuxWindowsJava

2021-08-13 05:50:01

ContainerdDockerKubernetes

2021-10-25 16:01:01

Linux設備樹字符串

2022-08-17 18:25:37

Java分布式搜索引擎

2021-08-31 07:02:20

Diff算法DOM

2023-08-01 08:27:15

Java I/ONIO

2020-10-29 08:55:04

微服務

2021-10-06 20:23:08

Linux共享內存

2022-04-15 08:03:41

SaaS應用管理市場

2021-08-31 07:02:34

數據響應Vue偵測數據變化

2021-04-19 17:32:34

Java內存模型

2025-01-20 09:15:00

iOS 18.3蘋果iOS 18

2023-03-30 08:52:40

DartFlutter

2021-04-02 06:17:10

大數加減乘除數據結構算法

2025-04-07 08:20:00

ORMPython代碼

2020-11-30 12:32:40

PyTorch語義分割python

2024-01-29 09:04:15

Wi-Fi數據設備

2023-10-30 18:08:50

2022-06-10 09:04:24

Python讀取文件代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91在线看| 一级片毛片 | 久久久久久久久久久久久久av | 国产成人黄色 | 日韩欧美黄色 | 日韩av在线一区二区 | 欧美精品91| 亚洲免费视频网站 | 成人免费视频网站在线观看 | 免费看黄色片 | 视频在线日韩 | 国产高清免费视频 | 日日操天天射 | 免费成人高清在线视频 | 国产在线一区二区三区 | 日韩在线一区二区三区 | 国产在线观看网站 | 国产免费xxx | 北条麻妃av一区二区三区 | 狠狠色综合久久丁香婷婷 | 一级片免费视频 | 欧美性受xxxx | 国产精品一区二区三区在线 | 欧美日韩在线成人 | 91视频大全 | 97国产精品视频人人做人人爱 | 欧美激情综合色综合啪啪五月 | 日韩一区二区在线播放 | 久久精品伊人 | 91爱爱·com | 日韩免费在线观看视频 | 国内在线视频 | 中文字幕一区二区三区在线乱码 | 56pao在线| 国产精品久久久久久婷婷天堂 | 欧美激情综合 | www.久久久.com | 国产精品久久一区 | 日韩精品| 99久久婷婷国产综合精品 | 日韩欧美亚洲一区 |