java 對象基礎(chǔ)信息(創(chuàng)建過程,內(nèi)存結(jié)構(gòu),如何定位,分配)

對象創(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());)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容