ps:熱部署和熱加載實際上是兩個相似但不一樣的概念,以前理解不深,so,這篇文章重構了下。java
在應用運行的時升級軟件,無需從新啓動的方式有兩種,熱部署和熱加載。git
對於Java應用程序來講,熱部署就是在服務器運行時從新部署項目,熱加載即在在運行時從新加載class,從而升級應用。github
熱加載的實現原理主要依賴java的類加載機制,在實現方式能夠歸納爲在容器啓動的時候起一條後臺線程,定時的檢測類文件的時間戳變化,若是類的時間戳變掉了,則將類從新載入。web
對比反射機制,反射是在運行時獲取類信息,經過動態的調用來改變程序行爲;
熱加載則是在運行時經過從新加載改變類信息,直接改變程序行爲。 spring
熱部署原理相似,但它是直接從新加載整個應用,這種方式會釋放內存,比熱加載更加乾淨完全,但同時也更費時間。sql
熱部署做爲一個比較靈活的機制,在實際的生產上運用仍是有,但相對不多,熱加載則基本沒有應用。分析以下編程
熱加載這種直接修改jvm中字節碼的方式是難以監控的,不一樣於sql等執行能夠記錄日誌,直接字節碼的修改幾乎沒法記錄代碼邏輯的變化,對既有代碼行爲的影響難以控制,對於越注重安全的應用,熱加載帶來的風險越大,這比如給飛行中的飛機更換髮動機。tomcat
技術大部分是跟需求掛鉤的,而須要熱部署的情景不多。安全
在生產中,並無須要頻繁部署的應用,即便是敏捷,再快也是一週一次的迭代,而且經過業務劃分和模塊化編程,部署的代價徹底能夠忽略不計,對於現有的應用,啓動耗時再長,也並不是長到沒法忍受,若是真的這麼長,那更應該考慮的是如何進行模塊拆分,分佈式部署了。服務器
對於沒法中止服務的應用,好比如今的雲計算平臺這樣分佈式應用,採用分批上線也能夠知足需求,相似熱部署方案應該是放在最後考慮的解決方案。
在生產中,不會有頻繁的部署而且啓動耗時長的應用,但因爲雲計算的興起,熱部署仍是有其應用。
而熱加載有點玩火,太危險了。但在開發和debug中,頻繁啓動應用卻隨處可見,熱加載機制能夠極大的提高開發效率。這兩種機制,在開發中還有另一種稱呼—開發者模式。
對於大型項目:每每啓/停須要等待幾分鐘時間。更浪費時間的是,對於一個類中的方法的調試過程,若是修改屢次,須要反覆的啓停服務器,浪費的時間更多。
以目前的crm項目爲例,其啓動時間爲5m,以一天debug重啓十次,一個月工做20天來算,每一年重啓耗時25人日,若是能徹底使用熱加載,每一年節省重啓時間近1人月。
crm pool啓動耗時
在struts2中熱加載即開發者模式,在struts.xml配置
<constant name="struts.devMode" value="true" />
從而當更改struts.xml文件後不須要從新啓動服務器就能夠進行程序調試。
tomcat自己默認開啓了熱部署方式,但熱部署是直接從新加載整個應用,耗時跟重啓服務器差很少,咱們須要的實際上是熱加載,即修改了哪一個class,只從新加載這一個class,這樣耗時幾乎爲0。
對於tomcat5.x 以上版本,均已支持必定程度上得熱加載,但這種方式只針對代碼行級別的,也就是說若是新刪方法,註解,類,或者變量時是無效的,只能重啓,這是我目前在公司開發時用的方式,能夠顯著下降debug時的重啓次數,提升開發效率
1.將tomcat server.xml文件的context reloadable 值置爲false 或者在web modules中編輯取消Auto reloading選項。
<Context reloadable="false"/>
OR
2.修改eclipse中的server配置
這樣作能夠在在修改代碼以後,不會自動重啓服務器,而只加載代碼,新增一行java代碼ctrl+s後直接刷新頁面或調用接口便可看到效果,無需重啓tomcat。
tomcat的熱加載機制不只能夠在本地debug時,tomcat的遠程調試也支持熱部署,經過eclipse debug遠程到遠程tomcat上,修改本地代碼,ctrl+s後直接刷新頁面後調用接口,便可發現遠程tomcat已將本地代碼進行了熱加載。
jrebel插件能夠進行更完全的熱加載,不只包括類,甚至支持spring 等配置文件的熱加載,但公司項目開發環境複雜,目前在eclipse中配置一直沒有成功,只能使用tomcat自帶的熱加載機制。
在實際生產中熱部署在雲計算中運用挺多,但熱加載沒有,而在開發中,熱加載能夠顯著的提高工做效率,強烈推薦使用熱加載方式,不只tomcat,大多數其餘servlet容器也支持這種方式,你們能夠自行搜索相關技巧。
參考文檔 :
做者:初龍
原文連接:https://chulung.com/article/thermal-deployment-and-thermal-loading-of-java
本文由MetaCLBlog於2017-07-17 09:00:02自動同步至cnblogs
本文基於 知識共享-署名-非商業性使用-禁止演繹 4.0 國際許可協議發佈,轉載必須保留署名及連接。