Java對象存儲內(nèi)存布局詳解
Java對象存儲內(nèi)存布局
眾所周知,Java是一門面向?qū)ο蟮恼Z言,那么一個對象在內(nèi)存中都包含什么東西呢,首先,對象大部分是存儲在堆上的(逃逸除外 )。
那么對象存儲在堆中主要分為三個部分
- 對象頭、對象實例數(shù)據(jù)、對齊補充(數(shù)組會多一個數(shù)組長度)
- 對象頭:
mark word: 存儲對象的hashCode、鎖信息(鎖升級)或分代年齡或GC標(biāo)志等信息
類型指針: 存儲指向?qū)ο笏鶎兕悾?strong>元數(shù)據(jù)中class文件)的指針,JVM通過這個確定這個對象屬于哪個類
- 對象實例數(shù)據(jù):
new出的對象信息,存放類的屬性數(shù)據(jù)信息,包括父類的屬性信息;
- 對齊補充
數(shù)組對象會多對齊填充
JVM要求對象占用的空間必須是8 的倍數(shù),方便內(nèi)存分配(以字節(jié)為最小單位分配),因此這部分就是用于填滿不夠的空間湊數(shù)用的。
Java對象的訪問定位
- 主流的訪問方式主要有句柄與直接指針
- 句柄:
Java堆中劃分出一塊內(nèi)存作為句柄池,棧中的reference中存儲的事對象的句柄地址,而句柄中包含了對象實例數(shù)據(jù)與類型數(shù)據(jù)各自具體的地址信息
- 直接指針:
java堆中對象的內(nèi)存布局必須考慮如何防止訪問類型數(shù)據(jù)的相關(guān)信息,reference中存儲的直接是對象地址。
- 直接指針訪問對象不需要多一次間接訪問開銷,而句柄方便在對象地址發(fā)生改變時(垃圾回收會移動對象地址)只需要改變句柄中的指針引用本身不需要改變。
**
**
Java對象的創(chuàng)建過程
虛擬機遇到new指令時,先去檢查指定的類是否被加載、驗證、準(zhǔn)備(為類中的所有靜態(tài)變量分配內(nèi)存空間,并為其設(shè)置一個初始值 ) 、解析、初始化過。
類檢查后虛擬機為新對象分配內(nèi)存
如何保證并發(fā)情況分配堆內(nèi)存安全
虛擬機采用CAS配上失敗重試保證原子性
把內(nèi)存分配交給線程,在創(chuàng)建線程時分配空間,把分配內(nèi)存的任務(wù)交給線程支配。通過TLAB(Thread local Allocation Buffer)開啟
分配完內(nèi)存后設(shè)置對象頭,如哪個類的實例、hashcode、類的元數(shù)據(jù)信息指針(方法區(qū))
執(zhí)? init ?法(內(nèi)核方法),初始化成員變量,執(zhí)?實例化代碼塊,調(diào)?類的構(gòu)造?法,并把堆內(nèi)對象的?地址賦 值給引?變量。
Java對象分配內(nèi)存是否線程安全
CAS 加失敗重試保證更新原?性。
把內(nèi)存分配按線程劃分在不同空間,即每個線程在 Java 堆中預(yù)先分配??塊內(nèi)存,叫做本地線程分配緩沖 TLAB,哪個線程要分配內(nèi)存就在對應(yīng)的 TLAB 分配,TLAB ?完了再進(jìn)?同步。
Java類實例化順序
- 父類靜態(tài)成員和靜態(tài)初始化塊 ,按在代碼中出現(xiàn)的順序依次執(zhí)行
- 子類靜態(tài)成員和靜態(tài)初始化塊 ,按在代碼中出現(xiàn)的順序依次執(zhí)行
- 父類實例成員和實例初始化塊 ,按在代碼中出現(xiàn)的順序依次執(zhí)行
- 父類構(gòu)造方法
- 子類實例成員和實例初始化塊 ,按在代碼中出現(xiàn)的順序依次執(zhí)行
- 子類構(gòu)造方法
到此這篇關(guān)于Java對象存儲內(nèi)存布局詳解的文章就介紹到這了,更多相關(guān)Java對象內(nèi)存布局內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java Lock鎖多線程中實現(xiàn)流水線任務(wù)
這篇文章主要介紹了Java Lock鎖多線程中實現(xiàn)流水線任務(wù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-05-05Mybatis中#{}和${}傳參的區(qū)別及#和$的區(qū)別小結(jié)
這篇文章主要介紹了Mybatis中#{}和${}傳參的區(qū)別及#和$的區(qū)別小結(jié) 的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-07-07解決IDEA service層跳轉(zhuǎn)實現(xiàn)類的快捷圖標(biāo)消失問題
這篇文章主要介紹了解決IDEA service層跳轉(zhuǎn)實現(xiàn)類的快捷圖標(biāo)消失問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02