對象創(chuàng)建過程
class T{
int m= 8;
}
T t = new T();
對應(yīng)匯編指令
0 new #2<T> // 分配內(nèi)存
3 dup
4 invokespecial #3 <T.<init>> //初始化(執(zhí)行init方法)
7 astore_1 //建立關(guān)聯(lián)( 將引用指向到該內(nèi)存)
8 return
內(nèi)存結(jié)構(gòu)
Object o = new Object();
在內(nèi)存中的組成為:
類型 起始位置 長度
頭 markword 0 4 bytes (四個字節(jié)) 存鎖信息
頭 markword 4 4 bytes (四個字節(jié)) 存鎖信息
頭 classpoint 8 4 bytes (四個字節(jié)) (類定義指針 開啟壓縮后為 4個字節(jié) 不開啟為8,默認(rèn)開啟 64位jvm)
(數(shù)組特有) length 12 4 bytes (四個字節(jié)) 數(shù)組特有結(jié)構(gòu)
屬性數(shù)據(jù) - - (空對象沒有屬性數(shù)據(jù),否則默認(rèn)往后追加, 注意 普通引用 例如String 也是默認(rèn)壓縮 為4字節(jié),不壓縮為8 64位jvm)
補(bǔ)位數(shù)據(jù) 12 4 bytes (四個字節(jié),由于cpu讀取和總線寬度有關(guān),為了讀取速度更快,jvm會將對象占用內(nèi)存大小,優(yōu)化為 8的 倍數(shù))
markword存儲信息包括
- synchronized鎖信息
- GC信息(分代年齡)
- HashCode(對象獨(dú)一無二的HashCode,不是重寫的方法值)
對象怎么定位
- 句柄方式 : 間接尋址,(GC穩(wěn)定)
- 直接指針 : 直接尋址
對象分配過程
- 允許私有的小對象可以存儲在棧中(C struct 結(jié)構(gòu)體)
- 大對象 默認(rèn)是50M 可以通過參數(shù)配置 -XX:PretenureSizeThreshold
- TLAB 線程本地緩存區(qū)(避免線程間內(nèi)存競爭,不需要鎖),也在伊甸園區(qū)
- AGE 超過年齡限制

分配過程
工具
open jdk 提供 JOL = Java Object LayOut java 對象 布局
(打印對象內(nèi)存模型 System.out.println(ClassLayout.parseInstance(o).toPrintable());)