| 在class文件中描述的各種信息,最終都需要被加載到虛擬機中之后,才能被運行和使用。 虛擬機把描述類的數(shù)據(jù)從class文件加載到內(nèi)存,并對數(shù)據(jù)進行校驗,轉(zhuǎn)換,解析和初始化,最終形成可以被虛擬機直接使用的java類型,這就是虛擬機的類加載機制。 類加載的時機: 類從被加載到虛擬機內(nèi)存開始,到卸載出內(nèi)存為止,其生命周期包括: 加載(loading),驗證(verification),準備(preparation),解析(resolution),初始化(initialization),使用(using),卸載(unloading)。 需要對類進行初始化的情況: 1.遇到new,jestatic,putstatic,invokestatic這四條字節(jié)碼指令。  類加載過程: 加載: 1.通過一個類的全限定名來獲取定義此類的二進制字節(jié)流。  驗證: 具體包括 1.文件格式驗證;  準備: 準備階段是正式為類變量分配內(nèi)存并設(shè)置類變量初始值的階段,這些內(nèi)存都將在方法區(qū)進行分配。 注意:這時候進行內(nèi)存分配的僅包括類變量(被static修飾的變量),而不包括實例變量,實例變量將在對象實例化的時候隨著對象的實例一起被分配到j(luò)ava堆中。 解析: 虛擬機將常量池內(nèi)的符號引用替換為直接引用的過程 初始化: 到初始化階段,才真正開始執(zhí)行類中定義的java程序代碼; 類加載器:“通過一個類的全限定名來獲取描述此類的二進制字節(jié)流”,實現(xiàn)這個動作的代碼模塊稱為“類加載器”。 雙親委派機制:如果一個類加載器收到了類加載的請求,它首先不會嘗試自己去加載這個類,而是把這個請求委派給父類加載器去完成,每一層的類加載器都是如此,因此所有的加載請求最終都應(yīng)該被傳送到頂層啟動類的加載器中,只有父加載器反饋自己無法完成加載請求時,子加載器才會嘗試自己去加載。 | 
|  |