JVM類加載機制總結

JVM內存分區(qū):五大區(qū)

1.Java堆:幾乎所有的對象實例和數(shù)組都在這類分配內存
2.方法區(qū):它用于存儲已經被虛擬機加載的類信息(static)、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據
3.虛擬機棧:用于存儲局部變量表、操作數(shù)棧、動態(tài)鏈接、方法返回地址和一些額外的附加信息
4.本地方法棧: 該區(qū)域與虛擬機棧所發(fā)揮的作用非常相似,只是虛擬機棧為虛擬機執(zhí)行Java方法服務,而本地方法棧則為使用到的本地操作系統(tǒng)方法服務
5.程序計數(shù)器:它是當前線程所執(zhí)行的字節(jié)碼的行號指示器

Paste_Image.png
Paste_Image.png

加載流程

Paste_Image.png
Paste_Image.png

1.加載:類加載器把編譯好的class文件加載到jvm內存中
把靜態(tài)變量轉變?yōu)榉椒▍^(qū)的數(shù)據結構
在java堆中生成一個代表這個類的java.lang.Class對象,作為對方法區(qū)中這些數(shù)據的訪問入口
2.驗證:驗證class文件格式數(shù)據是否正確
3.準備(不執(zhí)行代碼):為靜態(tài)變量賦默認值,分配內存空間
4.解析:將常量池中的符號引用轉化為直接引用
5.初始化(執(zhí)行代碼):
先運行靜態(tài)變量和靜態(tài)代碼塊
調用普通方法和構造器,如果父類未初始化則先初始化父類

主動調用:
1.new實例
2.調用反射
3.對static屬性賦值
被動調用:
初始化并未用到該類

類加載器詳解

Paste_Image.png

Paste_Image.png

雙親委派模型。雙親委派模型要求除了頂層的啟動類加載器,其余的類加載器都應該有自己的父類加載器。這里類加載器之間的父子關系一般不會以繼承關系來實現(xiàn),而是使用組合關系來復用父加載器的代碼。
雙親委派模型的工作過程是:如果一個類加載器收到了類加載器的請求,它首先不會自己嘗試加載這個類,而是把這個請求委派給父類加載器去完成,每一個層次的類加載器都是如此,因此所有的加載請求最終都應該傳送到頂層的啟動類加載器中,只有當父類加載器反饋自己無法完成這個加載請求(它的搜索范圍中沒有找到所需的類時),子加載類才會嘗試自己去加載。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容