1. 程式人生 > 其它 >深入理解Java虛擬機器之物件例項化篇

深入理解Java虛擬機器之物件例項化篇

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方法。初始化成員變數,執行例項化程式碼塊,呼叫類的構造方法,並把堆內物件的首地址賦值給引用變數