創建
1、從常量池中加載類的符號引用(類的數據結構和方法信息等),找不到就代表類還沒有加載,進行類的加載
2、給對象分配內存(對象創建過程中,內存區域大小就已經定義好了)使用方式看垃圾回收是否有內存整理功能
2.1指針碰撞
2.2空閒列表
3、線程安全問題
3.1加鎖,同步獲取效率低
3.2每個線程操作不同區進行內存分配,本地線程分配緩衝 TLAB 不夠時再進行分配新的內存(使用同步)
4、初始化對象,基本數據類型有內容,其他數據類型爲null
5、執行構造方法
結構
1、header(對象頭)
1.1自身運行時數據(markWord)- hashcode gc分代年齡 鎖狀態標誌 線程持有的鎖 偏向線程id 偏向時間戳,大小是根據操作系統 32位和64位。存儲方式,根據不同鎖狀態,每個位置放入不同的內容,類似mqtt。具體百度找圖看
1.2類型指針。確定元數據(是哪個類的實例),(直接訪問的定位,需要有類型指針)
1.3 java 數組保存數組長度的數據
2、instanceData (實例信息)
存儲順序:分配策略(hotspot 相同字節數字段放在一起,long/double short/char)和源碼字段順序影響
3、padding (對齊填充)
佔位符功能 hotspot 要求對象起始地址要是8個字節的整數倍,所以每個對象要是8個字節的整數倍,填充不足8字節的內容
訪問定位
1、直接訪問,通過引用直接訪問對象的內存地址(對象中存儲類型指針)hotspot使用
2、使用句柄,引用指向句柄(句柄中存儲類型指針和對象內存指針)句柄池單獨存儲