“一個空Object對象的占多大空間?” 一個工作了5年的Java程式員直接被搞蒙了。 大家好,我是Mic,一個工作了14年的Java程式員。 我把這個問題的文字版本整理到了15W字的面試文檔里,大家可以掃描文章尾端領取。 下麵看看高手的回答。 高手: 在開啟了壓縮指針的情況下,Object預設會占 ...
“一個空Object對象的占多大空間?”
一個工作了5年的Java程式員直接被搞蒙了。
大家好,我是Mic,一個工作了14年的Java程式員。
我把這個問題的文字版本整理到了15W字的面試文檔里,大家可以掃描文章尾端領取。
下麵看看高手的回答。
高手:
在開啟了壓縮指針的情況下,Object預設會占用12個位元組,但是為了避免偽共用問題,JVM會按照8個位元組的倍數進行填充,所以會填充4個位元組變成16個位元組長度。
在關閉壓縮指針的情況下,Object預設會占用16個位元組,16個位元組正好是8的整數倍,因此不需要填充。
在HotSpot 虛擬機裡面,一個對象在堆記憶體裡面的記憶體佈局是使用OOP結構來表示的,
它主要分為三個部分。
-
對象頭,包括Markword、類元指針、數組長度其中Markword用來存儲對象運行時的相關數據,比如hashCode、gc分代年齡等。
在64位操作系統中占8個位元組,32位操作系統中占4個位元組類元指針指向當前實例對象所屬哪個類,開啟指針壓縮的情況下占4個位元組,未開啟則占8個位元組數組長度只有對象數組才會存在,占4個位元組
-
實例數據,存儲對象中的欄位信息
-
對齊填充,Java對象的大小需要按照8個位元組或者8個位元組的倍數對齊,避免偽共用問題。
因此,一個空的對象,在開啟壓縮指針的情況下,占16個位元組
其中Markword占8個位元組、類元指針占4個位元組, 對齊填充占4個位元組。
總結
這個問題不僅僅考察JVM基礎還考察求職者對於JVM對於對象記憶體佈局的理解程度。
對於記憶體佈局這塊的理解主要還是幫助我們更好的解決JVM應用上的實際問題
喜歡的朋友記得點贊收藏加關註!!!
版權聲明:本博客所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自
Mic帶你學架構
!
如果本篇文章對您有幫助,還請幫忙點個關註和贊,您的堅持是我不斷創作的動力。歡迎關註「跟著Mic學架構」公眾號公眾號獲取更多技術乾貨!