Java 虛擬機類加載器詳解
- 作者:新網(wǎng)
- 來源:新網(wǎng)
- 瀏覽:100
- 2018-05-03 17:53:24
我們編寫好的Java程序都是由若干個class文件組織而成。當我們程序運行時,會調(diào)用該程序的一個入口函數(shù)來執(zhí)行程序功能,而這些功能是封裝在不同的class文件中的,所以就常常會從這個class文件調(diào)用另一個class文件中的方法。如果另外一個class文件不存在,就會引發(fā)系統(tǒng)異常。
<
div> 我們編寫好的Java程序都是由若干個class文件組織而成。當我們程序運行時,會調(diào)用該程序的一個入口函數(shù)來執(zhí)行程序功能,而這些功能是封裝在不同的class文件中的,所以就常常會從這個class文件調(diào)用另一個class文件中的方法。如果另外一個class文件不存在,就會引發(fā)系統(tǒng)異常。
程序在啟動時,絕對不會加載程序需要的所有class文件,而是根據(jù)程序需要,通過Java的類加載機制來動態(tài)地加載某一個class文件到內(nèi)存當中。
類加載器在Java中非常重要,下面從如下幾個方面來進行講解。
二、什么是類加載器?
ClassLoader就是用來動態(tài)加載class文件到內(nèi)存當中的。
三、類加載器的類型
1、從開發(fā)者角度劃分:
(1)BootStrap ClassLoader
啟動類的加載器,負責(zé)加載放在JDK中l(wèi)i目錄下的文件。
(2)Extension ClassLoader
擴展類的加載器,負責(zé)加載JRE中ext目錄下的文件。
(3)App ClassLoader
應(yīng)用程序類加載器,負責(zé)加載用戶路徑下指定的類。
(1)啟動類加載器(C++語言實現(xiàn))
(2)所有其他類加載器(Java語言實現(xiàn))
四、雙親委派模型
每一層類加載器上方的類加載器叫作父類加載器。它們之間的父子關(guān)系不是通過繼承來實現(xiàn)的,而是使用組合關(guān)系來復(fù)用父類加載器中的代碼。
當類加載器需要加載一個class文件時,首先先請求父類加載器去加載,只有當所有父類加載器沒有找到對應(yīng)的類時,才會自己去加載。
雙親委派模型對于保護Java程序的穩(wěn)定性非常重要。
五、類加載過程(加載-->卸載)
1、靜態(tài)綁定、動態(tài)綁定
2、第一步:加載
(1)通過一個類的全限定名來獲取其定義的二進制字節(jié)流
(2)將這個字節(jié)流所代表的靜態(tài)存儲結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運行時數(shù)據(jù)結(jié)構(gòu)
(3)在Java堆中生成一個代表這個類的lang
.lang.Class對象,作為對方法區(qū)中的這些數(shù)據(jù)的訪問入口
3、第二步:驗證
為了確保class文件中的字節(jié)流包含的信息符合當前虛擬機的要求
4、第三步:準備
正式為類變量分配內(nèi)存,并設(shè)置類變量初始化。
這些內(nèi)存是在方法區(qū)中分配的。
(1)同時被static和final修飾的變量必須在聲明的時候就賦值
(2)數(shù)組初始化時,默認值為null,其中元素也被相應(yīng)賦上默認值
5、第四步:解析
6、第五步:初始化
執(zhí)行類構(gòu)造方法的過程(注意:成員變量初始化在準備階段就完成了