首頁  >  文章  >  Java  >  計算一個Java物件佔用位元組數的方法

計算一個Java物件佔用位元組數的方法

高洛峰
高洛峰原創
2017-01-05 17:30:411591瀏覽

本文實例講述如何計算(或者說,估算)一個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

by


D:填充物

在Hotspot中,每個物件佔用的總空間是以8的倍數計算的,物件佔用總空間(物件頭+聲明變數)不足8的倍數時候,自動補齊。而,這些被填滿的空間,我們可以稱它為「填充物」。我們看下具體實例:

 
一個空物件(沒有宣告任何變數)佔用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中文網!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn