虛擬機把描述類的數(shù)據(jù)從Class文件加載到內(nèi)存,并對數(shù)據(jù)進行校驗、轉(zhuǎn)換解析和初始化,最終形成可被虛擬機直接使用的java類型,這就是虛擬機的類加載機制。
Java語言中類的加載、連接和初始化過程都是在程序運行期間完成的,領(lǐng)Java具備高度的靈活性。
類加載的過程:加載、連接(驗證、準備、解析)、初始化。
– 加載:通過一個類的名字獲取此類的二進制字節(jié)流(PS:不限于從文件中讀?。粚⑦@個字節(jié)流代表的靜態(tài)存儲結(jié)構(gòu)轉(zhuǎn)換為方法區(qū)的運行時結(jié)構(gòu)(由具體的虛擬機自己定義);在內(nèi)存中生成一個java.lang.Class對象,作為方法區(qū)這個類的各種數(shù)據(jù)結(jié)構(gòu)的訪問入口。
– 驗證:文件格式驗證、元數(shù)據(jù)驗證(語義分析,類與類的繼承關(guān)系等)、字節(jié)碼驗證(數(shù)據(jù)流和控制流分析)、符號引用驗證(對類自身以外的信息進行匹配校驗)
– 準備:正式為類變量分配內(nèi)存并設(shè)置初始值,這里類變量指的是被static修飾的變量。例外:如果類字段是常量,則在這里會被初始化為表達式指定的值。
– 解析:將常量池內(nèi)的符號引用替換為直接引用。符號引用:類似于OS中的邏輯地址;直接引用:類似于OS中的物理地址,直接指向目標的指針、相對偏移量或一個能間接定位到目標的句柄。
– 初始化:真正開始執(zhí)行類中定義的Java程序代碼;初始化用于執(zhí)行Java類的構(gòu)造方法。類初始化的過程是不可逆的,如果中間一步出錯,則無法執(zhí)行下一步。
本文鏈接:
本文章“JVM如何加載字節(jié)碼文件?”已幫助 245 人
免責聲明:本信息由用戶發(fā)布,本站不承擔本信息引起的任何交易及知識產(chǎn)權(quán)侵權(quán)的法律責任!
本文由賦能網(wǎng) 整理發(fā)布。了解更多培訓機構(gòu)》培訓課程》學習資訊》課程優(yōu)惠》課程開班》學校地址等機構(gòu)信息,可以留下您的聯(lián)系方式,讓課程老師跟你詳細解答:
咨詢熱線:4008-569-579