深入理解Java虛擬機器之物件例項化篇
阿新 • • 發佈:2021-10-13
Java是面向物件的靜態強型別語言,我們一般先宣告並建立物件,根據某個類宣告一個引用變數指向被建立的物件,並使用此引用變數操作該物件,如Object obj = new Object(),obj 即引用變數,也叫例項成員變數。下面通過簡單地從執行步驟的角度來分析
物件例項化
Java是面向物件的靜態強型別
語言,我們一般先宣告並建立物件,根據某個類宣告一個引用變數指向被建立的物件,並使用此引用變數操作該物件,如Object obj = new Object()
,obj 即引用變數
,也叫例項成員變數
。下面通過簡單地從執行步驟的角度來分析:
確定類元資訊是否存在
。當JVM接受到new
指令時,首先在metaspace
內檢查需要建立的類元資訊
是否存在。若不存在,那麼在雙親委派
模式下,使用當前類載入器
以ClassLoader + 包名 + 類名
為Key進行查詢對應的.class檔案。如果沒有找到檔案,則丟擲ClassNotFoundException
異常;如果找到,則進行類載入,並生成對應的Class類物件。分配物件記憶體
。首先計算物件所佔用空間的大小,如果例項成員變數是引用變數,僅分配引用變數
即可,即4個位元組大小,接著在堆中劃分一塊記憶體給新物件。在分配記憶體空間時,需進行同步操作
,比如採用CAS
(Compare And Swap)失敗重試
、區域加鎖
等方式保證分配操作的原子性
。設定預設值
。成員變數值都需要設定為預設值,即各種不同形式的零值
。設定物件頭
。設定新物件的雜湊碼
、GC資訊
、鎖資訊
、物件所屬的類元資訊
等。具體的設定方式取決於JVM實現
。執行init方法
。初始化成員變數
,執行例項化程式碼塊
,呼叫類的構造方法
,並把堆內物件的首地址賦值給引用變數
。