java的类载入器
【0】README
0.1)本文文字轉(zhuǎn)自: 深入剖析tomcat, 旨在 理解 jvm 的類載入器;
【1】 jvm的類載入器相關(guān)
1)jvm 使用了3種類載入器來(lái)載入所需要的類:分別是引導(dǎo)類載入器(bootstrap class loader), 擴(kuò)展類載入器(extension class loader) 和 系統(tǒng)類載入器(system class loader)。而 引導(dǎo)類載入器是 擴(kuò)展類載入器的父親, 擴(kuò)展類載入器是 系統(tǒng)類載入器的父親。
2)3種載入器的詳細(xì)描述:
- 2.1)引導(dǎo)類載入器: 用于引導(dǎo)啟動(dòng) jvm。當(dāng)調(diào)用 javax.exe 是, 就會(huì)啟動(dòng)引導(dǎo)類載入器。引導(dǎo)類載入器是使用本地代碼來(lái)實(shí)現(xiàn)的, 因?yàn)樗脕?lái)載入運(yùn)行 jvm 所需要的類, 以及所有的 java 核心類。如 java.lang 包 和 java.io 包下的類。啟動(dòng)類載入器會(huì)在 rt.jar 和 i18n.jar 等java 包中搜索要載入的類。
- 2.2) 擴(kuò)展類載入器: 負(fù)責(zé)載入標(biāo)準(zhǔn)擴(kuò)展目錄中的類。sum 公司的 jvm 的標(biāo)準(zhǔn)擴(kuò)展目錄是 /jdk/jre/lib/ext/;
- 2.3)系統(tǒng)類載入器:是默認(rèn)的類載入器, 他會(huì)搜索在環(huán)境變量 CLASSPATH 中指明的路徑和 JAR 文件;
3)jvm 使用的是哪種類載入器呢?
3.1)答案在于 類載入器的代理模型。
3.2)載入一個(gè)類 的steps(每當(dāng)需要載入一個(gè)類 的時(shí)候):
- step1)首先調(diào)用 系統(tǒng)類載入器,但并不會(huì)立即載入這個(gè)類;
- step2)相反,他會(huì)將載入類的任務(wù)交給其父類載入器——擴(kuò)展類載入器;
- step3) 而擴(kuò)展類載入器也會(huì)將載入任務(wù)交給其父類載入器——引導(dǎo)類載入器;
3.3)因此,引導(dǎo)類載入器會(huì)首先執(zhí)行載入某個(gè)類的任務(wù)。接下來(lái)有4中cases:
- case1)如果引導(dǎo)類載入器找不到需要載入的類,那么擴(kuò)展類載入器會(huì)嘗試 載入該類;
- case2)如果擴(kuò)展類載入器也找不到該類,就輪到系統(tǒng)類載入器繼續(xù)執(zhí)行載入任務(wù);
- case3)如果系統(tǒng)類載入器也找不到這個(gè)類,拋出 ClassNotFoundException 異常;
3.4)為什么要這么做? 代理模型的重要用途就是為了 解決 類載入過(guò)程中的安全問(wèn)題;
- 看個(gè)荔枝: 當(dāng)程序的某個(gè)地方調(diào)用了 自定義的 java.lang.Object 類時(shí), 系統(tǒng)類載入器會(huì)將載入工作 委托給 擴(kuò)展類載入器,繼而會(huì)被交給 引導(dǎo)類載入器。 引導(dǎo)類載入器搜索其 核心庫(kù), 找到標(biāo)準(zhǔn)的 java.lang.Object 類, 并將之實(shí)例化。 結(jié)果是, 自定義的 java.lang.Object 類并沒(méi)有被載入。幸運(yùn)的是, jvm 我們使用了 代理模型, 這種case 是不會(huì)發(fā)生 的。
4)關(guān)于 java 中類載入機(jī)制的一件重要事情是, 可以通過(guò)繼承抽象類 java.lang.ClassLoader 類 編寫自己的類載入器。而 tomcat 要使用自定義類載入器的原因有3條(reasons):
- r1) 為了在載入類中指定某些規(guī)則;
- r2)為了緩存已經(jīng)載入的類;
- r3)為了實(shí)現(xiàn)類的預(yù)載入,方便使用;
總結(jié)
- 上一篇: 整洁的近义词是什么 整洁的近义词有哪些
- 下一篇: jvm(2)-java内存区域