一、什么是Java對象
Java對象是一類事物的抽象,有狀態和行為。
二、Java對象的創建過程
2.1、Class加載
2.2、Class 鏈接 (驗證、准備、解析)
2.3、申請對象內存
2.4、成員變量賦默認值
2.5、調用構造方法
1、成員變量賦初始值
2、執行構造方法語句
三、Java對象的布局、結構
4.1、普通對象
1、對象頭 markword
2、ClassPointer指針 (啟動參數 -XX:+UserCompressedClassPointers 開啟時為4字節,不開啟為8字節)
3、實例數據 (引用類型, -XX:+UserCompressedClassPointers 開啟時為4字節,不開啟為8字節)
4、Padding對齊 8的倍數
4.2、數組對象
1、對象頭 markword
2、ClassPointer指針 (啟動參數 -XX:+UserCompressedClassPointers 開啟時為4字節,不開啟為8字節)
3、數組的長度
4、實例數據 (引用類型, -XX:+UserCompressedClassPointers 開啟時為4字節,不開啟為8字節)
5、Padding對齊 8的倍數
四、Java對象頭的結構
對象頭包含兩部分內容:
1、對象的狀態信息
對象的鎖信息(2位標識當前對象鎖的狀態,記錄鎖升級后,當前對象是何種鎖),hashcode信息
2、類型指針
通過類型指針了解對象時哪個類的實例
五、對象的訪問/對象的定位
1、句柄
相較於直接指針方式,通過句柄方式訪問對象的速率慢,但垃圾回收速率快

2、直接指針
相較於句柄方式,通過直接指針方式訪問對象的速率快,但垃圾回收速率慢

六、對象的大小
針對64位,Object o = new Object(); 在內存中占用了多少字節
1、markword 8字節
2、UseCompressed 開啟壓縮 4字節, 不開啟壓縮 8字節
3、實例數據 0 字節
4、Padding對齊 8的倍數
綜上:
開啟壓縮占用字節: 8 + 4 = 12 , 因為Padding對齊, 12 + 4 = 16
不開啟壓縮占用字節: 8 + 8 = 16, 不需要padding對齊
結論:
Object o = new Object();占用16字節。
