摘要:而熱部署技術能夠幫助開發人員減少重新部署的等待時間。本文的目的為調研熱部署的技術現狀及其對開發效率的幫助,并簡單梳理其技術實現的難點。熱部署技術總結熱部署目前有多種技術實現官方開源商業。
開發、自測、聯調期間代碼可能會被頻繁地修改,通常即使只增加了一行代碼,都需要重啟容器以檢查執行效果。而熱部署技術能夠幫助開發人員減少重新部署的等待時間。本文的目的為調研熱部署的技術現狀及其對開發效率的幫助,并簡單梳理其技術實現的難點。
熱部署技術 總結JVM熱部署目前有多種技術實現:官方、開源、商業。其中商業的JRebel功能強大,涵蓋了日常開發中大部分熱更新場景。以團隊中一個基于Tomcat + Spring的業務后臺為例,修改代碼后,本地冷啟動耗時4.5min,本地熱部署的時間則小于1s,極大改善了開發效率。
官方實現當前JVM和JVMTI(JVM Tool Interface)規范中通過相應的agent機制支持的retransformClass/redefineClass操作可以在加載前和加載后動態修改類的內容,從Java 5開始,這一功能還通過Instrumentation API直接提供給Java應用使用,但是其適用范圍是受限的:只能修改已有方法的方法體。
以下摘自 JVM(TM) Tool Interface 1.2.3
The redefinition may change method bodies, the constant pool and attributes. The redefinition must not add, remove or rename fields or methods, change the signatures of methods, change modifiers, or change inheritance. These restrictions may be lifted in future versions. See the error return description below for information on error codes returned if an unsupported redefinition is attempted.
IDE的edit-and-continue功能(Intellij Idea為Update Application)就用到了這種被稱為HotSwap的熱部署技術,但是它的限制太大,完全無法滿足實際開發中的需求。
Dynamic Code Evolution VM(DCEVM)這是一個由JKU主導的、基于HotSpot VM的研究項目,誕生于2010年。該項目希望能動態修改類的任意元素,包括成員、方法、注解、繼承等而無需重啟JVM。目前的light版已經支持到Java 8 update 144, build 2。
HotSwapAgent基于DCEVM構建的開源項目,其完成度要高于DCEVM,目前已發布1.0版。對于常見的IDE、IoC/ORM/Log框架、J2EE應用容器的支持比較完善。根據官方文檔,HA支持下列特性。
Add/remove/modify class fields.
Add/remove/modify methods. Add/remove/modify method annotations
Add/remove/modify classes including anonymous classes. HotswapAgent handless correct anonymous class redefinitions.
Add/remove static member of classes. HotswapAgent handles static member initialization.
Add/remove enum values
Refresh framework and application server settings
JRebelJava世界中大名鼎鼎的熱部署解決方案,熱部署特性與上面提到的HotSwapAgent類似。當然作為一款商業軟件,它支持的框架、IDE、J2EE應用容器的種類都更多,總計100+;同時支持Hotspot VM和Oracle VM;文檔和社區支持非常完善,很容易上手。
最重要的是,沒錢的碼農可以通過贊助官方的Social Plan免費激活JRebel!
JRebel實測測試環境為團隊使用的Tomcat + Spring + SpringMvc。
以下是實際開發中常見的改動類型的測試結果。【Pass】為支持,【Fail】為不支持。
【Pass】在Spring和SpringMvc的配置Xml中增加Bean定義
【Pass】新增Controller類,新增、修改Controller注解
【Pass】新增、修改RequestHandler方法、方法體、方法簽名、注解
【Fail】在Spring和SpringMvc的配置Xml中增加、修改容器配置項。如
熱部署的本質,簡單的理解,是在運行中實時增加、替換JVM中的類文件而無需重啟JVM。
眾所周知,JVM使用ClassLoader加載類文件,內含的雙親委派模型通過指定類文件加載的順序避免由于類沖突而導致核心類庫加載失敗。單個ClassLoader不能加載全限定名相同的類;不能修改已加載的類的聲明;不能卸載已加載的類,除非移除整個ClassLoader,或者被GC回收。
那么,修改原有的類(如Test.class)的任意元素后,熱部署就會面臨很多問題。比方說:
兩個全限定名相同的類如何加載?
類的實例化如何獲取到新的類?
更新類的聲明后,如增加類方法、實例方法;修改類方法、實例方法簽名、方法體、方法注解;新增、修改類變量、實例變量;修改接口、類的繼承關系,調用點怎么指向新的類?
如果JVM使用了內聯優化技術呢?
如何保證反射正確,比如調用Class的getName()、getMethods()、getField()等方法時如何獲取到新的類?
如果用了容器或者框架,修改JavaConfig或者XML后,怎么反映到容器里?
熱部署問題在底層繞不開ClassLoader,當一個類被更新后,需要被重新載入到ClassLoader中,原先對類變量、實例變量、類方法、實例方法的調用都需要重定向到新類。可以通過引入一個包含所有符號鏈接的中間層,當JVM加載用戶的類時進行動態增強,并記錄下涉及的符號鏈接。
舉幾個實現思路的小例子:
在類加載時為新的類起一個新的限定名(如原來的類名是Test,而新的類名是Test_v1),繞開ClassLoader的限制。
所有指向老的類的符號鏈接都實時替換為相應的新符號鏈接
在ClassLoader中查找老的類時返回新的類
監控容器配置文件,發生變化后調用容器refresh API
ReferenceJava SE 6 新特性 Instrumentation 新功能
HotSwapAgent
深入探索 Java 熱部署
DCEVM
Get True Hot Swap in Java with DCEVM and IntelliJ IDEA
Features - JRebel
HotSwap和JRebel原理
實現增強的java class hotswap (三) 解決方案 續
實現增強的java class hotswap (三) 解決方案
Java是否可以做到修改類而不用重啟JVM?
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70435.html
摘要:效率專精系列善用統一描述語言提升開發效率分鐘搞定環境配置與使用考慮到篇幅較長的文檔反復修改的情況,要快速找到修改點比較困難。 之前零零散散寫了幾篇文章,主要是實際開發過程中一些效率痛點和相應的改善方法。今天抽空溫故知新,把之前的內容串起來,做了個小總結,即《效率專精系列》小系列的總集篇。 回顧項目開發流程 開發一個新項目時,開發流程大概分成以下幾步: 設計方案,并落地成設計文檔 設計...
摘要:目前團隊中前后端聯調是較之個人單獨開發相對耗時的一個環節,主要體現在環境下的部署時間較長。本文的目的是通過將聯調本地化,減少部分枯燥勞動以及無效的等待時間,提高團隊的開發效率。不需要更改的為外部,保持即可。 目前團隊中前后端聯調是較之個人單獨開發相對耗時的一個環節,主要體現在: beta環境下的部署時間較長。首先部署beta需要經過push分支、合并沖突、build、部署四個步驟。...
摘要:基礎問題的的性能及原理之區別詳解備忘筆記深入理解流水線抽象關鍵字修飾符知識點總結必看篇中的關鍵字解析回調機制解讀抽象類與三大特征時間和時間戳的相互轉換為什么要使用內部類對象鎖和類鎖的區別,,優缺點及比較提高篇八詳解內部類單例模式和 Java基礎問題 String的+的性能及原理 java之yield(),sleep(),wait()區別詳解-備忘筆記 深入理解Java Stream流水...
摘要:基礎問題的的性能及原理之區別詳解備忘筆記深入理解流水線抽象關鍵字修飾符知識點總結必看篇中的關鍵字解析回調機制解讀抽象類與三大特征時間和時間戳的相互轉換為什么要使用內部類對象鎖和類鎖的區別,,優缺點及比較提高篇八詳解內部類單例模式和 Java基礎問題 String的+的性能及原理 java之yield(),sleep(),wait()區別詳解-備忘筆記 深入理解Java Stream流水...
閱讀 3693·2021-11-25 09:43
閱讀 2653·2021-11-25 09:43
閱讀 3850·2021-11-24 09:38
閱讀 702·2021-11-18 10:02
閱讀 2242·2021-09-22 15:53
閱讀 3002·2019-08-30 15:44
閱讀 2778·2019-08-30 14:01
閱讀 2760·2019-08-29 15:15