Java 對象的創建過程


引言

重點講講普通的對象、數組對象以及class對象的創建過程。

對象通常由三個部分組成:對象頭、實例數據喝對齊填充。

1. 普通對象創建過程

  1. 類加載
  2. 分配內存
  3. 初始化
  4. 設置對象頭
  5. 執行init方法

1.1 類加載

JVM遇到new 關鍵字時,會去常量池中查看有無該類的符號引用,並檢查其是否加載、解析和初始化。如果有則,進行下一步分配內存,否則執行類加載機制。

類的加載指的是將類的.class文件中的二進制數據讀入到內存中,將其放在運行時數據區的方法區內,然后在堆區創建一個 java.lang.Class對象,用來封裝類在方法區內的數據結構。

詳細過程:加載-連接-初始化-使用-卸載
詳細過程

new指令對應語言層面上,對象克隆、對象序列化

1.2 分配內存

對象所需內存大小根據加載的類來確定,為對象分配內存也就是在堆內存中分配一塊確定大小的內存。

這里有兩個點需要注意:

  1. 內存划分方式
  • 指針碰撞
  • 空閑列表
  1. 並發內存分配帶來的混亂
  • CAS比較與交換
  • TLAB本地線程分配緩沖

1.3 初始化

JVM初始化分配好的內存,將其設為零值,注意不包括對象頭。如果使用了TLAB,這一步可以提前到內存分配階段進行。

1.4 設置對象頭

對象頭包含兩部分信息。第一部分是用於存儲對象自身的運行時數據,如hashcode、GC分代年齡、鎖狀態標志、線程持有的鎖等;第二部分是類型指針,指向它對應的類元數據,VM用這個確定其屬於哪個類的實例。

1.5 執行init方法

主要是對屬性賦值,執行構造函數。

參考文獻

【1】Java 對象結構:https://www.cnblogs.com/maxigang/p/9040088.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM