熱部署與熱加載:
熱部署和熱加載都是基于類加載器實現的,熱加載是服務器監聽class等文件的改變然后對改變的文件進行局部加載,所以不會刪除session,也不會釋放內存。熱部署就是全局部署,會清空session以及釋放內存。
類加載機制:
java類加載器主要有:
根類加載器(Bootstrap ClassLoader) 一般加載%JAVA_HOME%/jre/lib下的一些jar包的class文件
擴展類加載器(Extension ClassLoader) 一般加載%JAVA_HOME%/jre/lib/ext中jar包的class文件
系統類加載器(System?ClassLoader) 一般加載來自java命令的-classpath指定的jar包和類路徑
自定義加載器(User ClassLoader) 用戶自定義的加載器,默認的父加載器是系統類加載器
這些加載器有一個雙親委派的機制,就是說,當一個加載器接收到請求,他會委托他的父類加載器去加載。如果父類找不到,他才會去加載。舉個栗子,java.lang.String 類,如果是系統類加載器接到請求,他會委托給擴展類加載器,擴展類加載器會委托給根類加載器,因為java.lang.String.class是在%JAVA_HOME%/jre/lib/rt.jar下,所以最終由根類加載器加載到JVM內存
類加載的階段:
加載:將類的class文件讀入內存,并創建一個java.lang.Class對象放入方法區
驗證:檢測被加載的類是否有正確的內部結構,會不會威脅虛擬機的安全等
準備:為static修飾的變量分配內存,并設置初始值,int型的是0,如果是static final修飾的,則進入常量池
解析:將類的二進制數據中的符號引用替換為直接引用。
初始化:當初始化一個類的時候,如果發現其父類還沒有進行過初始化、則需要先觸發其父類的初始化,將準備階段的初始值完成賦值。初始化運行主類,比如main方法。
tomcat熱部署實現方式:
1.直接把項目的web文件夾放在webapps里
2.在tomcat/conf/server.xml的<host>里添加<context>
<Context?docBase="xxx"?path="/xxx"?reloadable="true"/>
其中docBase是你項目的web文件夾所在的目錄,path是用來在瀏覽器訪問項目的虛擬路徑。
3.在tomcat/conf/Catalina/localhost/下添加一個xml,內容如下
<?xml version="1.0" encoding="UTF-8"?>
<Context?docBase="xxx" reloadable="true"/>
其中docBase和reloadable跟第二步一樣,而項目訪問的虛擬路徑是這個xml文件的文件名。
SpringBoot實現熱加載
1.springloaded方式: 通過在maven的plug里加springloaded依賴
注意這種方式只能通過maven的方式去啟動。在idea編輯器里可以配置maven啟動
注意maven啟動命令是mvn spring-boot:run 但是idea已經默認前面加了mvn,所以這里配置不需要再寫mvn了。
2.通過spring-boot-devtools方式: 在maven添加依賴
注意用idea編輯器的,idea實現熱加載還需要修改兩個地方配置
這個要勾選上
然后按shift+alt+ctrl+/?
這個勾選上。到此就ok了。
自定義加載器實現熱加載
用戶自定義加載器需要繼承ClassLoader,實現原理就是通過一個線程去監聽文件的修改時間,然后重寫findClass方法,把文件以流的形式讀進來,然后調defineClass方法。在JDK1.2之后,雙親委派模式已經被引入到類加載體系中,因此不建議重寫loadClass方法,只需要重寫findClass就可以了
這里是重寫findClass核心代碼。