java文件在解釋成class文件之后,需要對里面的類進(jìn)行初始化,初始化的過程包括加載、連接、裝入三個(gè)過程,在加載的過程中會對類里面的靜態(tài)變量進(jìn)行一個(gè)初始化。下面詳細(xì)介紹下ClassLoader:
1、類的加載、連接和初始化
類初始化通常包括加載、連接、初始化三個(gè)步驟。
(1)進(jìn)程的結(jié)束
每當(dāng)運(yùn)行一個(gè)java程序時(shí),將會啟動一個(gè)java虛擬機(jī)進(jìn)程,不管程序多么復(fù)雜,有多少線程,都在這個(gè)java虛擬機(jī)進(jìn)程里。以下四種情況會使得該進(jìn)程被終止——
程序運(yùn)行到最后正常結(jié)束; 程序里遭遇了System.exit(),或者是Runtime.getRunTime().exit()代碼;程序執(zhí)行中遇到了未捕獲的異常或者錯(cuò)誤; java所在平臺強(qiáng)制結(jié)束了JVM進(jìn)程;
當(dāng)該進(jìn)程結(jié)束,那么該進(jìn)程在內(nèi)存中的狀態(tài)將會丟失,包括靜態(tài)變量的值。
(2)類的加載
類的加載是指將類的class文件讀入內(nèi)存,并為之創(chuàng)建一個(gè)java.lang.class對象。
(3)類的連接
類的連接負(fù)責(zé)把類的二進(jìn)制數(shù)據(jù)合并到JRE中,分為三個(gè)階段——
驗(yàn)證:檢驗(yàn)被加載的類是否有正確的內(nèi)部結(jié)構(gòu); 準(zhǔn)備:負(fù)責(zé)為類的靜態(tài)Field分配內(nèi)存,并設(shè)置默認(rèn)初始值;解析:將類的二進(jìn)制數(shù)據(jù)中的符號應(yīng)用替換成直接引用。
(4)類的初始化
類的初始化,主要就是對靜態(tài)Field進(jìn)行初始化。
2、類加載器
(1)類加載器簡介
類加載器負(fù)責(zé)加載所有的類,系統(tǒng)為所有載入內(nèi)存里的類都會生成一個(gè)java.lang.class對象;
同一個(gè)類只會被加載一次,在JVM中每一個(gè)不同的類都會有一個(gè)不同的類加載器負(fù)責(zé)。
類加載器在不包括用戶自定義的加載器的情況下包括三層:
Bootstrap Classloader根加載器; ExtensionClassloader擴(kuò)展類加載器; SystemClassLoader系統(tǒng)類加載器;
①根加載器,又稱為引導(dǎo)或者原始加載器,負(fù)責(zé)加載java的核心類;
②擴(kuò)展類加載器,負(fù)責(zé)加載JRE的擴(kuò)展目錄中JAR包的類;
③系統(tǒng)類加載器,又稱為應(yīng)用加載器,
1、類的加載、連接和初始化
類初始化通常包括加載、連接、初始化三個(gè)步驟。
(1)進(jìn)程的結(jié)束
每當(dāng)運(yùn)行一個(gè)java程序時(shí),將會啟動一個(gè)java虛擬機(jī)進(jìn)程,不管程序多么復(fù)雜,有多少線程,都在這個(gè)java虛擬機(jī)進(jìn)程里。以下四種情況會使得該進(jìn)程被終止——
程序運(yùn)行到最后正常結(jié)束; 程序里遭遇了System.exit(),或者是Runtime.getRunTime().exit()代碼;程序執(zhí)行中遇到了未捕獲的異常或者錯(cuò)誤; java所在平臺強(qiáng)制結(jié)束了JVM進(jìn)程;
當(dāng)該進(jìn)程結(jié)束,那么該進(jìn)程在內(nèi)存中的狀態(tài)將會丟失,包括靜態(tài)變量的值。
(2)類的加載
類的加載是指將類的class文件讀入內(nèi)存,并為之創(chuàng)建一個(gè)java.lang.class對象。
(3)類的連接
類的連接負(fù)責(zé)把類的二進(jìn)制數(shù)據(jù)合并到JRE中,分為三個(gè)階段——
驗(yàn)證:檢驗(yàn)被加載的類是否有正確的內(nèi)部結(jié)構(gòu); 準(zhǔn)備:負(fù)責(zé)為類的靜態(tài)Field分配內(nèi)存,并設(shè)置默認(rèn)初始值;解析:將類的二進(jìn)制數(shù)據(jù)中的符號應(yīng)用替換成直接引用。
(4)類的初始化
類的初始化,主要就是對靜態(tài)Field進(jìn)行初始化。
2、類加載器
(1)類加載器簡介
類加載器負(fù)責(zé)加載所有的類,系統(tǒng)為所有載入內(nèi)存里的類都會生成一個(gè)java.lang.class對象;
同一個(gè)類只會被加載一次,在JVM中每一個(gè)不同的類都會有一個(gè)不同的類加載器負(fù)責(zé)。
類加載器在不包括用戶自定義的加載器的情況下包括三層:
Bootstrap Classloader根加載器; ExtensionClassloader擴(kuò)展類加載器; SystemClassLoader系統(tǒng)類加載器;
①根加載器,又稱為引導(dǎo)或者原始加載器,負(fù)責(zé)加載java的核心類;
②擴(kuò)展類加載器,負(fù)責(zé)加載JRE的擴(kuò)展目錄中JAR包的類;
③系統(tǒng)類加載器,又稱為應(yīng)用加載器,