概念
類的加載指:
1态坦、將類的.class文件中的二進制數(shù)據(jù)讀到內(nèi)存中
2攀操、放在運行時數(shù)據(jù)區(qū)的方法區(qū)中发钝,然后在堆區(qū)創(chuàng)建.class的對象
3揩魂、對外提供訪問方法區(qū)的數(shù)據(jù)結(jié)構(gòu)的接口
4博烂、JVM規(guī)范允許類加載器預加載該類,預加載的過程遇到class文件缺失或錯誤义桂,類加載器必須在程序被首次調(diào)用時才報告錯誤
類的生命周期
加載 驗證 準備 解析 初始化 使用 卸載
其中解析階段不一定是這個順序,可以在初始化之后開始解析蹈垢,主要為了支持java的運行時綁定(動態(tài)綁定)慷吊。
1、加載:
通過類的全限定名來獲取定義的二進制字節(jié)流
將這個字節(jié)流所代表的靜態(tài)存儲結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)運行時數(shù)據(jù)結(jié)構(gòu)
在java堆中生成一個代表這個類的對象曹抬,作為訪問入口
2溉瓶、驗證
確保被加載類的正確性
3、準備
對類變量分配內(nèi)存 以及初始化默認值
注:初始化值通常情況下 數(shù)據(jù)類型默認零值
1谤民、對于基本數(shù)據(jù)類型來說堰酿,類變量和全局變量如果不顯式的對其賦值而直接使用,則系統(tǒng)會默認零值
2张足、局部變量來說触创,使用前必須顯示賦值,否則編譯不通過
3为牍、static和final修飾的常量哼绑,必須聲明時顯式賦值,否則編譯不通過。并且常量在準備階段就會被初始化為指定值碉咆。
4抖韩、final修飾的常量則可以在聲明時顯式賦值,也可以在類初始化時顯式賦值疫铜∶。總之必須使用前顯式賦值,否則系統(tǒng)不會為其賦予零值
4壳咕、解析:把類中的符號引用轉(zhuǎn)換為直接引用
5席揽、初始化
1、為類的靜態(tài)變量賦正確的初始值(聲明類變量指定初始值谓厘,靜態(tài)代碼塊指定初始值)
2驹尼、初始化時機:只有當類主動使用時,才會導致類初始化庞呕。
創(chuàng)建類的實例
訪問類的靜態(tài)變量,調(diào)用類的靜態(tài)方法 程帕,反射住练,初始化子類會先初始化父類,啟動類
6愁拭、結(jié)束生命周期
執(zhí)行system.exit()方法讲逛,程序正常結(jié)束,出現(xiàn)異常導致結(jié)束岭埠,操作系統(tǒng)錯誤導致jvm進程終止盏混。
類加載器
啟動類加載器 java.開頭的類
擴展類加載器 javax.開頭的類
應用程序類加載器 負載加載用戶類路徑所指定的類蔚鸥。開發(fā)者可以直接使用該類加載器,沒有指定則默認
jvm類加載機制
1许赃、全盤負責 :當一個類加載器負責某個類時止喷,他所依賴的類也由他負責加載
2、父類委托:先讓父類加載器試圖加載混聊。
3弹谁、緩存機制:保證所有加載過的class都會被緩存。所以修改了class后句喜,必須重啟jvm预愤,程序修改才會 生效
類的加載方式
1、命令行啟動應用jvm初始化
2咳胃、class.forName()動態(tài)加載 植康,還會對類進行解釋,執(zhí)行static塊
3展懈、classLoader.loadClass() 動態(tài)加載销睁,只會干一件事,將.class文件加載到jvm中标沪。 只有newinstance才會執(zhí)行static塊
雙親委派模式
如果一個類加載器收到類加載請求榄攀,會依次向上交給父加載器。因此所有的類加載請求都會最終傳遞到頂層的啟動類加載器金句。
意義:防止內(nèi)存中出現(xiàn)多份同樣的字節(jié)碼檩赢,保證程序安全穩(wěn)定運行