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