JVM之类的加载过程(三):初始化——>Initialization
本篇主要講解類的初始化,也就是上圖紅框的部分。
類的初始化都做了哪些事呢?
一、初始化:
1.初始化階段就是執(zhí)行類構(gòu)造器方法<clinit>() 的過程。
2.此方法不需要定義,是javac編譯器自動(dòng)收集類中的所有類變量的賦值動(dòng)作和靜態(tài)代碼塊中的語句合并而來。
發(fā)現(xiàn)只要有類變量的賦值和靜態(tài)代碼塊,系統(tǒng)默認(rèn)生成<clinit>() 方法。
看如下代碼:
它的字節(jié)碼文件:
就會(huì)發(fā)現(xiàn)沒有<clinit>()方法。
3.構(gòu)造器方法中指令按語句在源文件中出現(xiàn)的順序進(jìn)行執(zhí)行。
4.<clinit>() 不同于類的構(gòu)造器,一旦一個(gè)類進(jìn)行聲明后,系統(tǒng)默認(rèn)會(huì)生成該類的無參構(gòu)造器,也就對(duì)應(yīng)的是字節(jié)碼文件中的<init>() 方法。
5.若該類具有父類,JVM 會(huì)保證子類的<clinit>() 執(zhí)行前,父類的<clinit>() 已經(jīng)執(zhí)行完畢。
如上圖,執(zhí)行ClinitTest1的main() 方法,首先會(huì)進(jìn)行ClinitTest1 加載到內(nèi)存中,然后進(jìn)行鏈接,初始化完成后,調(diào)用它的main() 方法執(zhí)行打印輸出Son.B,又
由于Son 繼承Father類,會(huì)先執(zhí)行Father類的<Clinit>() 方法,將A=1,在執(zhí)行靜態(tài)代碼塊,A=2,再去執(zhí)行Son的<clinit>() 方法,將A=2的值賦值給B,最后輸出
B的值為2.
6. 虛擬機(jī)必須保證一個(gè)類的<clinit>() 方法在多線程下被同步加鎖,也就是一個(gè)類只會(huì)被加載一次。存放到方法區(qū)中,并進(jìn)行緩存。
二、初始化時(shí)機(jī):(也就是何時(shí)才會(huì)進(jìn)行初始化):
?
三、虛擬機(jī)自帶的加載器:
1、啟動(dòng)類加載器(引導(dǎo)類加載器,Bootstrap ClassLoader):
a.這個(gè)類加載使用c/c++ 語言實(shí)現(xiàn)的,嵌套在JVM 內(nèi)部。
b.它是來加載Java的核心庫(kù)(JAVA_HOME/jre/lib/rt.jar、resources.jar 或sun.boot.class.path 路徑下的內(nèi)容),用于提供JVM自身需要的類
如下圖代碼:
運(yùn)行結(jié)果:
c.并不繼承java.lang.ClassLoader,沒有父類加載器。
d.加載擴(kuò)展類和應(yīng)用程序類加載器,并指定為他們的父類加載器。
e.出去安全考慮,Bootstrap 啟動(dòng)類加載器只加載包名為java、javax、sun 等開頭的類。
2、擴(kuò)展類加載器:
a、Java語言編寫,由sun.misc.Launcher$ExtClassLoader實(shí)現(xiàn)。
b、派生于ClassLoader
c、父類加載器為啟動(dòng)類加載器。
d、從java.ext.dirs 系統(tǒng)屬性所指定的目錄中加載類庫(kù),或從JDK的安裝目錄的jre/lib/ext子目錄下加載類庫(kù),如果用戶創(chuàng)建的jar放在此目錄下,也會(huì)自動(dòng)由擴(kuò)展類加載器加載。
如下圖代碼:
運(yùn)行結(jié)果:
3、應(yīng)用程序類加載器(系統(tǒng)類加載器,AppClassLoader)
a、java語言編寫,由sun.misc.Launcher$AppClassLoader實(shí)現(xiàn)
b、派生于ClassLoader類
c、父類加載器為擴(kuò)展類加載器。
d、它負(fù)責(zé)加載環(huán)境變量classpath 或系統(tǒng)屬性 java.class.path 指定路徑下的類庫(kù)。
e、該類加載時(shí)程序 默認(rèn)的類加載器,一般來說,java 應(yīng)用的類都是由他來加載完成的
f、通過ClassLoader#getSystemClassLoader() 方法可以獲取到該類加載器
?
總結(jié)
以上是生活随笔為你收集整理的JVM之类的加载过程(三):初始化——>Initialization的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 21g2
- 下一篇: scrapy 项目实战(一)----爬