亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

【效率專精系列】幾種常見的JVM熱部署技術(shù)及實現(xiàn)難點淺談

dongfangyiyu / 847人閱讀

摘要:而熱部署技術(shù)能夠幫助開發(fā)人員減少重新部署的等待時間。本文的目的為調(diào)研熱部署的技術(shù)現(xiàn)狀及其對開發(fā)效率的幫助,并簡單梳理其技術(shù)實現(xiàn)的難點。熱部署技術(shù)總結(jié)熱部署目前有多種技術(shù)實現(xiàn)官方開源商業(yè)。

開發(fā)、自測、聯(lián)調(diào)期間代碼可能會被頻繁地修改,通常即使只增加了一行代碼,都需要重啟容器以檢查執(zhí)行效果。而熱部署技術(shù)能夠幫助開發(fā)人員減少重新部署的等待時間。本文的目的為調(diào)研熱部署的技術(shù)現(xiàn)狀及其對開發(fā)效率的幫助,并簡單梳理其技術(shù)實現(xiàn)的難點。

熱部署技術(shù) 總結(jié)

JVM熱部署目前有多種技術(shù)實現(xiàn):官方、開源、商業(yè)。其中商業(yè)的JRebel功能強大,涵蓋了日常開發(fā)中大部分熱更新場景。以團隊中一個基于Tomcat + Spring的業(yè)務(wù)后臺為例,修改代碼后,本地冷啟動耗時4.5min,本地?zé)岵渴鸬臅r間則小于1s,極大改善了開發(fā)效率。

官方實現(xiàn)

當(dāng)前JVM和JVMTI(JVM Tool Interface)規(guī)范中通過相應(yīng)的agent機制支持的retransformClass/redefineClass操作可以在加載前和加載后動態(tài)修改類的內(nèi)容,從Java 5開始,這一功能還通過Instrumentation API直接提供給Java應(yīng)用使用,但是其適用范圍是受限的:只能修改已有方法的方法體。

以下摘自 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 IdeaUpdate Application)就用到了這種被稱為HotSwap的熱部署技術(shù),但是它的限制太大,完全無法滿足實際開發(fā)中的需求。

Dynamic Code Evolution VM(DCEVM)

這是一個由JKU主導(dǎo)的、基于HotSpot VM的研究項目,誕生于2010年。該項目希望能動態(tài)修改類的任意元素,包括成員、方法、注解、繼承等而無需重啟JVM。目前的light版已經(jīng)支持到Java 8 update 144, build 2。

HotSwapAgent

基于DCEVM構(gòu)建的開源項目,其完成度要高于DCEVM,目前已發(fā)布1.0版。對于常見的IDE、IoC/ORM/Log框架、J2EE應(yīng)用容器的支持比較完善。根據(jù)官方文檔,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

JRebel

Java世界中大名鼎鼎的熱部署解決方案,熱部署特性與上面提到的HotSwapAgent類似。當(dāng)然作為一款商業(yè)軟件,它支持的框架、IDE、J2EE應(yīng)用容器的種類都更多,總計100+;同時支持Hotspot VM和Oracle VM;文檔和社區(qū)支持非常完善,很容易上手。

最重要的是,沒錢的碼農(nóng)可以通過贊助官方的Social Plan免費激活JRebel!

JRebel實測

測試環(huán)境為團隊使用的Tomcat + Spring + SpringMvc。
以下是實際開發(fā)中常見的改動類型的測試結(jié)果?!綪ass】為支持,【Fail】為不支持。

【Pass】在Spring和SpringMvc的配置Xml中增加Bean定義

【Pass】新增Controller類,新增、修改Controller注解

【Pass】新增、修改RequestHandler方法、方法體、方法簽名、注解

【Fail】在Spring和SpringMvc的配置Xml中增加、修改容器配置項。如 / / /

淺談熱部署的實現(xiàn)難點

熱部署的本質(zhì),簡單的理解,是在運行中實時增加、替換JVM中的類文件而無需重啟JVM。

眾所周知,JVM使用ClassLoader加載類文件,內(nèi)含的雙親委派模型通過指定類文件加載的順序避免由于類沖突而導(dǎo)致核心類庫加載失敗。單個ClassLoader不能加載全限定名相同的類;不能修改已加載的類的聲明;不能卸載已加載的類,除非移除整個ClassLoader,或者被GC回收。

那么,修改原有的類(如Test.class)的任意元素后,熱部署就會面臨很多問題。比方說:

兩個全限定名相同的類如何加載?

類的實例化如何獲取到新的類?

更新類的聲明后,如增加類方法、實例方法;修改類方法、實例方法簽名、方法體、方法注解;新增、修改類變量、實例變量;修改接口、類的繼承關(guān)系,調(diào)用點怎么指向新的類?

如果JVM使用了內(nèi)聯(lián)優(yōu)化技術(shù)呢?

如何保證反射正確,比如調(diào)用ClassgetName()getMethods()、getField()等方法時如何獲取到新的類?

如果用了容器或者框架,修改JavaConfig或者XML后,怎么反映到容器里?

熱部署問題在底層繞不開ClassLoader,當(dāng)一個類被更新后,需要被重新載入到ClassLoader中,原先對類變量、實例變量、類方法、實例方法的調(diào)用都需要重定向到新類??梢酝ㄟ^引入一個包含所有符號鏈接的中間層,當(dāng)JVM加載用戶的類時進行動態(tài)增強,并記錄下涉及的符號鏈接。

舉幾個實現(xiàn)思路的小例子:

在類加載時為新的類起一個新的限定名(如原來的類名是Test,而新的類名是Test_v1),繞開ClassLoader的限制。

所有指向老的類的符號鏈接都實時替換為相應(yīng)的新符號鏈接

在ClassLoader中查找老的類時返回新的類

監(jiān)控容器配置文件,發(fā)生變化后調(diào)用容器refresh API

Reference

Java SE 6 新特性 Instrumentation 新功能

HotSwapAgent

深入探索 Java 熱部署

DCEVM

Get True Hot Swap in Java with DCEVM and IntelliJ IDEA

Features - JRebel

HotSwap和JRebel原理

實現(xiàn)增強的java class hotswap (三) 解決方案 續(xù)

實現(xiàn)增強的java class hotswap (三) 解決方案

Java是否可以做到修改類而不用重啟JVM?

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/70435.html

相關(guān)文章

  • 效率專精系列】我有一個夢想:提高開發(fā)效率,晚上回家吃雞

    摘要:效率專精系列善用統(tǒng)一描述語言提升開發(fā)效率分鐘搞定環(huán)境配置與使用考慮到篇幅較長的文檔反復(fù)修改的情況,要快速找到修改點比較困難。 之前零零散散寫了幾篇文章,主要是實際開發(fā)過程中一些效率痛點和相應(yīng)的改善方法。今天抽空溫故知新,把之前的內(nèi)容串起來,做了個小總結(jié),即《效率專精系列》小系列的總集篇。 回顧項目開發(fā)流程 開發(fā)一個新項目時,開發(fā)流程大概分成以下幾步: 設(shè)計方案,并落地成設(shè)計文檔 設(shè)計...

    zhaot 評論0 收藏0
  • 效率專精系列】Beta環(huán)境不需要,本地聯(lián)調(diào)拯救開發(fā)效率

    摘要:目前團隊中前后端聯(lián)調(diào)是較之個人單獨開發(fā)相對耗時的一個環(huán)節(jié),主要體現(xiàn)在環(huán)境下的部署時間較長。本文的目的是通過將聯(lián)調(diào)本地化,減少部分枯燥勞動以及無效的等待時間,提高團隊的開發(fā)效率。不需要更改的為外部,保持即可。 目前團隊中前后端聯(lián)調(diào)是較之個人單獨開發(fā)相對耗時的一個環(huán)節(jié),主要體現(xiàn)在: beta環(huán)境下的部署時間較長。首先部署beta需要經(jīng)過push分支、合并沖突、build、部署四個步驟。...

    cc17 評論0 收藏0
  • 后臺開發(fā)常問面試題集錦(問題搬運工,附鏈接)

    摘要:基礎(chǔ)問題的的性能及原理之區(qū)別詳解備忘筆記深入理解流水線抽象關(guān)鍵字修飾符知識點總結(jié)必看篇中的關(guān)鍵字解析回調(diào)機制解讀抽象類與三大特征時間和時間戳的相互轉(zhuǎn)換為什么要使用內(nèi)部類對象鎖和類鎖的區(qū)別,,優(yōu)缺點及比較提高篇八詳解內(nèi)部類單例模式和 Java基礎(chǔ)問題 String的+的性能及原理 java之yield(),sleep(),wait()區(qū)別詳解-備忘筆記 深入理解Java Stream流水...

    spacewander 評論0 收藏0
  • 后臺開發(fā)常問面試題集錦(問題搬運工,附鏈接)

    摘要:基礎(chǔ)問題的的性能及原理之區(qū)別詳解備忘筆記深入理解流水線抽象關(guān)鍵字修飾符知識點總結(jié)必看篇中的關(guān)鍵字解析回調(diào)機制解讀抽象類與三大特征時間和時間戳的相互轉(zhuǎn)換為什么要使用內(nèi)部類對象鎖和類鎖的區(qū)別,,優(yōu)缺點及比較提高篇八詳解內(nèi)部類單例模式和 Java基礎(chǔ)問題 String的+的性能及原理 java之yield(),sleep(),wait()區(qū)別詳解-備忘筆記 深入理解Java Stream流水...

    xfee 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<