本文實例講述如何計算(或者說,估算)一個Java物件佔用的記憶體數量的方法。分享給大家供大家參考。具體分析如下:
通常,我們談論的堆記憶體使用的前提是以「一般情況」為背景的。不包括下面兩種情形:
某些情況下,JVM根本就沒有把Object放入堆中。例如:原則上講,一個小的thread-local物件存在於堆疊中,而不是在堆中。
被Object佔用記憶體的大小依賴Object的當前狀態。例如:Object的同步鎖是否生效,或者,Object是否正在被回收。
我們先來看看在堆中單一的Object長什麼樣子
在堆中,每個物件由四個域構成(A、B、C 和D),下面我們逐一解釋:
A:物件頭,佔用很少的位元組,表述Object目前狀態的資訊
B:基本型別域所佔用的空間(原生域指int、boolean、short等)
C:引用型別域所佔用的空間(參考型別域指其他物件的引用,每個引用佔用4個位元組)
D:填充物佔用的空間(後面說明什麼是填充物)
下面我們對A、B、C 和D 逐一解釋
A:在物件頭
記憶體中,每個物件佔用的總空間不僅包含物件內宣告的變數所需的空間,還包括一些額外訊息,例如:物件頭和填充物。 “物件頭”的作用是用來記錄一個物件的實例名字、ID 和 實例狀態(例如,當前實例是否“可到達”,或者當前鎖的狀態等等)。
在目前的JVM版本中(Hotspot),「物件頭」所佔用的位元組數如下:
一個普通對象,佔用8 bytes
數組,佔用12 bytes,包含普通物件的8 bytes + 4 bytes(數組長度)
B:基本型別
boolean、byte 佔用1 byte,char、short 佔用2 bytes,int、float 佔用4 bytes,long、double 佔用8 bytes
D:填充物
一個空物件(沒有宣告任何變數)佔用8 bytes -- > 物件頭佔用8 bytes
只宣告了一個boolean類型變數的類,佔用16 bytes --> 物件頭(8 bytes ) + boolean (1 bytes) + 填充物(7 bytes)
聲明了8個boolean類型變數的類,佔用16 bytes --> 物件頭(8 bytes) + boolean (1 bytes) * 8
通過上面的實例,更有助於我們加深對Java程式設計的理解。
更多計算一個Java物件佔用位元組數的方法相關文章請注意PHP中文網!