詳解Java對象創(chuàng)建的過程及內(nèi)存布局
一、對象的內(nèi)存布局
對象頭
對象頭主要保存對象自身的運行時數(shù)據(jù)和用于指定該對象屬于哪個類的類型指針。
實例數(shù)據(jù)
保存對象的有效數(shù)據(jù),例如對象的字段信息,其中包括從父類繼承下來的。
對齊填充
對齊填充不是必須存在的,沒有特別的含義,只起到一個占位符的作用。
二、對象的創(chuàng)建過程
實例化一個類的對象的過程是一個典型的遞歸過程。
在準(zhǔn)備實例化一個類的對象前,首先準(zhǔn)備實例化該類的父類,如果該類的父類還有父類,那么準(zhǔn)備實例化該類的父類的父類,依次遞歸直到遞歸到Object類。
此時,首先實例化Object類,再依次對以下各類進行實例化,直到完成對目標(biāo)類的實例化。具體而言,在實例化每個類時,都遵循如下順序:
1.先依次執(zhí)行實例變量初始化和實例代碼塊初始化
2.執(zhí)行構(gòu)造函數(shù)初始化。也就是說,編譯器會將實例變量初始化和實例代碼塊初始化相關(guān)代碼放到類的構(gòu)造函數(shù)中去,并且這些代碼會被放在對超類構(gòu)造函數(shù)的調(diào)用語句之后,構(gòu)造函數(shù)本身的代碼之前。
三、對象訪問定位
Java程序需要通過棧上的引用數(shù)據(jù)來操作堆上的具體對象。
對象的訪問方式取決于虛擬機實現(xiàn),目前主流的訪問方式有使用句柄和直接指針兩種。
句柄,可以理解為指向指針的指針,維護指向?qū)ο蟮闹羔樧兓?,而對象的句柄本身不發(fā)生變化;指針,指向?qū)ο?,代表對象的?nèi)存地址。
句柄
Java堆中劃分出一塊內(nèi)存來作為句柄池,引用中存儲對象的句柄地址,而句柄中包含了對象實例數(shù)據(jù)與類型數(shù)據(jù)各自的具體地址信息。
對象類型數(shù)據(jù)是被虛擬機加載的類信息。
直接指針
直接指針方式中,并沒有劃分句柄池,引用中存儲的直接就是對象地址。
四、參考
周志明,《深入理解Java虛擬機》
到此這篇關(guān)于詳解Java對象創(chuàng)建的過程及內(nèi)存布局的文章就介紹到這了,更多相關(guān)Java對象創(chuàng)建及內(nèi)存布局內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Caused by: java.io.IOException: DerInputStrea
這篇文章主要介紹了Caused by: java.io.IOException: DerInputStream.getLength(): lengthTag=111, too big,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-10-10SpringBoot中多環(huán)境配置和@Profile注解示例詳解
這篇文章主要介紹了SpringBoot中多環(huán)境配置和@Profile注解,本文結(jié)合示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-01-01Springboot視頻接口報大量的ClientAbortException找不到原因的解決
本文主要介紹了Springboot視頻接口報大量的ClientAbortException找不到原因的解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08如何解決UnsupportedOperationException異常問題
這篇文章主要介紹了如何解決UnsupportedOperationException異常問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05