虛擬機中對象的創建、結構及訪問 總結

創建

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、使用句柄,引用指向句柄(句柄中存儲類型指針和對象內存指針)句柄池單獨存儲

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章