jvm classLoader 过程
?1、加載(一般人所熟悉的雙親委托模型,這只是一個過程)
? ? 類的加載階段,主要是獲取定義此類的二進制字節(jié)流,并將這個字節(jié)流所代表的靜態(tài)存儲結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運行時數(shù)據(jù)結(jié)構(gòu),最后在Java堆中生成一個代表這個類的java.lang.Class對象作為方法區(qū)這些數(shù)據(jù)的訪問入口。相對于類加載過程的其他階段,加載階段是開發(fā)期可控性最強的階段。我們可以通過定制不通的類加載器,也就是ClassLoader來控制二進制字節(jié)流的獲取方式。(雙親委托模型的過程,找到對應(yīng)類的位置,以及確定類加載器)
? ?2、驗證
? ? 驗證,準(zhǔn)備和解析其實都屬于連接階段,而驗證就是連接階段的第一步。這一階段主要是為了確保Class文件的字節(jié)流中包含的信息復(fù)合當(dāng)前虛擬機的要求,并且不會危害虛擬機自身的安全。主要驗證過程包括:文件格式驗證,元數(shù)據(jù)驗證,字節(jié)碼驗證以及符號引用驗證。?
???
? ?3、準(zhǔn)備
? ? 準(zhǔn)備階段正式為類變量分配內(nèi)存并設(shè)置初始值。這里的初始值并不是初始化的值,而是數(shù)據(jù)類型的默認零值。這里提到的類變量是被static修飾的變量,而不是實例變量。關(guān)于準(zhǔn)備階段為類變量設(shè)置零值的唯一例外就是當(dāng)這個類變量同時也被final 修飾,那么在編譯時,就會直接為這個常量賦上目標(biāo)值。
? 4、解析
? 解析時虛擬機將常量池中的符號引用替換為直接引用的過程。
? ?
? ?5、初始化
? 在準(zhǔn)備階段,變量已經(jīng)賦過一次系統(tǒng)要求的初始值,在初始化階段,則是根據(jù)程序員通過程序的主觀計劃區(qū)初始化類變量和其 ? 他資源。Java虛擬機規(guī)范規(guī)定了有4種情況必須立即對類進行初始化(加載,驗證,準(zhǔn)備必須在此之前完成)?
? 1)當(dāng)使用new關(guān)鍵字實例化對象時,當(dāng)讀取或者設(shè)置一個類的靜態(tài)字段(被final修飾的除外)時,以及當(dāng)調(diào)用一個類的靜態(tài) ? ? 方法時(比如構(gòu)造方法就是靜態(tài)方法),如果類未初始化,則需先初始化。?
? 2)通過反射機制對類進行調(diào)用時,如果類未初始化,則需先初始化。?
? 3)當(dāng)初始化一個類時,如果其父類未初始化,先初始化父類。?
? 4)用戶指定的執(zhí)行主類(含main方法的那個類)在虛擬機啟動時會先被初始化。
?除了上面這4種方式,所有引用類的方式都不會觸發(fā)初始化,稱為被動引用。如:通過子類引用父類的靜態(tài)字段,不會導(dǎo)致子類 ?初始化;通過數(shù)組定義來引用類,不會觸發(fā)此類的初始化;引用類的靜態(tài)常量不會觸發(fā)定義常量的類的初始化,因為常量在編 ?譯階段已經(jīng)被放到常量池中了。
總結(jié)
以上是生活随笔為你收集整理的jvm classLoader 过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 29-相似矩阵和若尔当形
- 下一篇: 设置sonar 排除扫描文件及问题