網(wǎng)購手表網(wǎng)站查詢網(wǎng)站域名
什么是雙親委派機(jī)制?
Parent Delegation Model ,直譯過來可能叫做父級(jí)委托模型更容易理解
類的加載過程
- Java 編譯器將 Java源文件編譯成.class 文件
- 再由 JVM 加載 .class 文件到內(nèi)存中
- JVM 裝載完成后得到一個(gè) Class 字節(jié)碼對(duì)象
- 拿到字節(jié)碼對(duì)象之后 ,就可以實(shí)例化了
- 類的加載過程需要使用到加載器,JVM 設(shè)計(jì)了 3 個(gè)類加載器 ,分別是 :Bootstrap 類加載器、 Extension 類加載器和 應(yīng)用類加載器
- 這些類加載器分別加載不同作用范圍的 jar 包和.class 文件
- Bootstrap ClassLoader ,主要是負(fù)責(zé) Java 核心類庫的加載 ,也就是 %{JDK_HOME}\lib 下的 rt.jar、resources.jar 等
- Extension ClassLoader ,主要負(fù)責(zé)%{JDK_HOME}\lib\ext 目錄下的 jar 包和 class 文件
- Application ClassLoader ,主要負(fù)責(zé)當(dāng)前應(yīng)用里面的 classpath 下的所有 jar 包和類文件
- 除了系統(tǒng)自己提供的類加載器以外,還可以通過 ClassLoader 類實(shí)現(xiàn)自定義加載器,去滿足一些特殊場(chǎng)景的需求
雙親委派機(jī)制
- 雙親委派機(jī)制 ,也叫父級(jí)委托模型 ,就是指按照類加載器的層級(jí)關(guān)系 ,逐層進(jìn)行委派
- 我們需要加載一個(gè) class 文件的時(shí)候,首先會(huì)把這個(gè) class 的查詢和加載委派給父加載器去執(zhí)行
- 如果父加載器都無法加載 ,再嘗試自己來加載這個(gè) class
意義?
- 保證安全性,因?yàn)檫@種層級(jí)關(guān)系實(shí)際上代表的是一種優(yōu)先級(jí),也就是所有的類的加 載 ,優(yōu)先給 Bootstrap ClassLoader
- 對(duì)于核心類庫中的類 ,就沒辦法去破壞, 比如自己寫一個(gè) java.lang.String ,最終還是會(huì)交給 Bootstrap 類加載器加載,再加上每個(gè)類加載器都有不同的作用范圍 ,這就意味著自己寫的 java.lang.String 沒辦法去覆蓋核心類庫中類
- 避免重復(fù)加載,這種層級(jí)關(guān)系的設(shè)計(jì),可以避免類重復(fù)加載導(dǎo)致程序混亂的問題
- 即如果父加載器已經(jīng)加載過了 ,那么子加載器就沒必要去加載了
Tomcat的自定義類加載器
Tomcat在初始化的時(shí)候自定義了三個(gè)類加載器和其他的兩個(gè)類加載器
- CommonLoader:加載Tomcat所需要的jar包和class文件,可以被Tomcat容器本身以及各個(gè)Webapp訪問;
- CatalinaLoader:Tomcat容器私有的類加載器,加載路徑中的class對(duì)于Webapp不可見;
- SharedLoader:各個(gè)Webapp共享的類加載器,加載路徑中的class對(duì)于所有Webapp可見,對(duì)于Tomcat不可見;
- WebAppClassLoader:各個(gè)Webapp私有的類加載器,加載路徑中的class只對(duì)當(dāng)前Webapp可見;
- JasperLoader:它出現(xiàn)的目的就是為了被丟棄,加載路徑僅僅是某個(gè)JSP文件所編譯出來的那一個(gè).class文件;
意義?
- 隔離同類庫不同版本,因?yàn)門omcat是可以部署多個(gè)Web應(yīng)用程序的
- 共享同類庫同版本,多個(gè)應(yīng)用程序如果依賴相同類庫的相同版本,應(yīng)該共享同類庫的同版本,避免重復(fù)的類庫被加載進(jìn)JVM
- 隔離Tomcat與應(yīng)用程序的類庫,Tomcat也有自己依賴的類庫,不能與應(yīng)用程序的類庫沖突
- 熱部署,修改jsp內(nèi)容后無需重啟項(xiàng)目將它重新加載到內(nèi)存中,每個(gè)jsp對(duì)應(yīng)一個(gè)唯一的類加載器,當(dāng)檢測(cè)到j(luò)sp內(nèi)容發(fā)生更改的時(shí)候,直接卸載唯一的類加載器,然后重新創(chuàng)建類加載器,并加載jsp文件。