從 Java 14 開始区丑,Project Valhala引入了 Value Type(或者稱為 inline type),參考: Valhalla:openjdk.java.net/projects/va…,這里不討論 Value Type 也就是 record 類型茫虽。
首先刊苍,Java 對象在堆內(nèi)存內(nèi)存中結(jié)構(gòu)包括:
類型指針:一個指向類信息的指針,描述了對象的類型濒析。
標(biāo)記字(Mark Word):一組標(biāo)記正什,描述了對象的狀態(tài)号杏,包括對象散列碼(如果有)、對象的形狀(是否是數(shù)組)盾致、鎖狀態(tài)主经、數(shù)組長度(如果標(biāo)記顯示這個對象是數(shù)組,描述了數(shù)組的長度)
對齊性填充:所有對象都是8字節(jié)對齊的 -> 也就是說罩驻,所有對象的起始位置都是滿足A(A%8==0),所以對于有的對象需要這個對齊性填充來滿足這個規(guī)則护赊。
域變量區(qū)域:這個對象的域變量所占用的內(nèi)存。Java域變量存在兩類:原始類型(primitive type)和普通對象指針(ordinary object pointer)骏啰。
然后节吮, Java 對象的類型信息存儲于 Java 元空間之中,默認情況下(壓縮類指針開啟的情況下)透绩,對象頭的壓縮類指針指向 MetaSpace 的類空間,類空間中存儲各種指針型數(shù)據(jù),例如實現(xiàn)方法多態(tài)以及 virtual call 的 vtable 與 itable 保存著方法代碼地址的引用指針帚豪。非類空間中存儲著比較大的元數(shù)據(jù),例如常量池狸臣,字節(jié)碼瞭亮,JIT 編譯后的代碼等等。由于編譯后的代碼可能非常大固棚,以及 JVM 對于多語言支持的擴展可能動態(tài)加載很多類,所以將 MetaSpace 的類空間與非類空間區(qū)分開仙蚜。