引言
重點講講普通的對象、數組對象以及class對象的創建過程。
對象通常由三個部分組成:對象頭、實例數據喝對齊填充。
1. 普通對象創建過程
- 類加載
- 分配內存
- 初始化
- 設置對象頭
- 執行init方法
1.1 類加載
JVM遇到new 關鍵字時,會去常量池中查看有無該類的符號引用,並檢查其是否加載、解析和初始化。如果有則,進行下一步分配內存,否則執行類加載機制。
類的加載指的是將類的.class文件中的二進制數據讀入到內存中,將其放在運行時數據區的方法區內,然后在堆區創建一個 java.lang.Class對象,用來封裝類在方法區內的數據結構。
詳細過程:加載-連接-初始化-使用-卸載
new指令對應語言層面上,對象克隆、對象序列化
1.2 分配內存
對象所需內存大小根據加載的類來確定,為對象分配內存也就是在堆內存中分配一塊確定大小的內存。
這里有兩個點需要注意:
- 內存划分方式
- 指針碰撞
- 空閑列表
- 並發內存分配帶來的混亂
- CAS比較與交換
- TLAB本地線程分配緩沖
1.3 初始化
JVM初始化分配好的內存,將其設為零值,注意不包括對象頭。如果使用了TLAB,這一步可以提前到內存分配階段進行。
1.4 設置對象頭
對象頭包含兩部分信息。第一部分是用於存儲對象自身的運行時數據,如hashcode、GC分代年齡、鎖狀態標志、線程持有的鎖等;第二部分是類型指針,指向它對應的類元數據,VM用這個確定其屬於哪個類的實例。
1.5 執行init方法
主要是對屬性賦值,執行構造函數。
參考文獻
【1】Java 對象結構:https://www.cnblogs.com/maxigang/p/9040088.html