1.類加載機(jī)制

類的生命周期包含7個(gè)階段
1.1 加載
加載指的是將類的字節(jié)碼讀入到內(nèi)存,并為之創(chuàng)建一個(gè)java.lang.Class對(duì)象的過程。
分為三個(gè)步驟:
- 通過類的全限定名來獲取定義此類的二進(jìn)制字節(jié)流
- 將類的字節(jié)流代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)
- 在堆中生成一個(gè)代表此類的java.lang.Class對(duì)象,作為訪問方法區(qū)這些數(shù)據(jù)結(jié)構(gòu)的入口。
1.2 校驗(yàn)
此階段主要確保Class文件的字節(jié)流中包含的信息符合當(dāng)前虛擬機(jī)的要求,并且不會(huì)危害虛擬機(jī)的自身安全。過程不展開說。
1.3 準(zhǔn)備
為類的靜態(tài)變量分配內(nèi)存。并設(shè)置初始值。
1.4 解析
將常量值的引用替換成實(shí)際值
1.5 初始化
執(zhí)行類中的靜態(tài)代碼塊。類中靜態(tài)變量賦值。
1.6 使用
代碼中根據(jù)Class類型new對(duì)象或執(zhí)行其它操作。
1.7 卸載
虛擬機(jī)通過垃圾回收將類信息及相關(guān)的實(shí)例數(shù)據(jù)從虛擬機(jī)內(nèi)存區(qū)域中移除。
2.類加載器
在類加載的第一階段“加載”過程中,需要通過一個(gè)類的全限定名來獲取定義此類的二進(jìn)制字節(jié)流,完成這個(gè)動(dòng)作的代碼塊就是類加載器。
虛擬機(jī)規(guī)范中并沒有指明二進(jìn)制字節(jié)流必須要從一個(gè)Class文件獲取。這種開放的設(shè)計(jì)在很多方面得到充分運(yùn)用,如:動(dòng)態(tài)代理技術(shù)。JDK原生動(dòng)態(tài)代理、CGLib動(dòng)態(tài)代理的實(shí)例類型的字節(jié)碼都不是從.class 文件中讀取的,而是在運(yùn)行時(shí)動(dòng)態(tài)生成的。
2.1 Bootstrap ClassLoader
和JVM一樣,啟動(dòng)類加載器 Bootstrap ClassLoader是用本地代碼(一般是C語言)實(shí)現(xiàn)的,它負(fù)責(zé)加載核心Java Class(即所有java.*開頭的類)。即存放在%JAVA_HOME%\lib目錄中的類庫。
Extension ClassLoader、Application ClassLoader 也是由Bootstrap ClassLoader加載的。
2.2 Extension ClassLoader
擴(kuò)展類加載器 Extension ClassLoader 由Java語言編寫。負(fù)責(zé)加載擴(kuò)展的Java Class(如所有javax.*開頭的類和存放在%JAVA_HOME%\lib\ext目錄中的類)
2.3 Application ClassLoader
應(yīng)用類加載器Application ClassLoader由Java語言編寫。負(fù)責(zé)加載應(yīng)用程序自身的類庫。開發(fā)者可直接使用。程序中默認(rèn)的類加載器。
開發(fā)者可以通過繼承ClassLoader父類來創(chuàng)建自己的類加載器。
3.雙親委派模型

簡(jiǎn)單描述下雙親委派模型:
某個(gè)類加載器收到加載類的請(qǐng)求時(shí),會(huì)首先將加載任務(wù)向上傳遞委托給父類加載器執(zhí)行。直至將任務(wù)委托給頂級(jí)的類加載器Bootstrap ClassLoader。當(dāng)任務(wù)已提交到Bootstrap ClassLoader后。進(jìn)行第二個(gè)階段:執(zhí)行加載任務(wù)或退回加載任務(wù)。如果當(dāng)前類加載器可以完成類加載任務(wù),就成功返回。如果無法完成此加載任務(wù)時(shí),則將任務(wù)退回給對(duì)應(yīng)的子類類加載器。
使用雙親委派模型的好處:
一個(gè)Class不一定能被特定的類加載器加載。使用雙親委派模型,從啟動(dòng)類加載器 到 最初接收任務(wù)的類加載器 這條路徑上的類加載器都會(huì)依次嘗試加載類??勺畲蟪潭缺U弦粋€(gè)特定的類型加載成功。
同一個(gè)類被兩個(gè)不同的類加載器分別加載,會(huì)被虛擬機(jī)識(shí)別成兩個(gè)類。使用雙親委派模型可最大程度保障一個(gè)特定的類型僅被加載一次,避免沖突。
參考
https://blog.csdn.net/u011080472/article/details/51332866
https://blog.csdn.net/m0_38075425/article/details/81627349