国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

計算一個Java對象占用字節數的方法

2019-11-26 15:19:32
字體:
來源:轉載
供稿:網友

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

C:引用類型
每個引用類型占用 4 bytes

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程序設計的理解。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 富川| 泰顺县| 历史| 石狮市| 西丰县| 遂溪县| 罗源县| 晋州市| 措勤县| 虞城县| 乐都县| 大足县| 汤原县| 禹州市| 台江县| 靖远县| 黑河市| 永靖县| 呼图壁县| 舞阳县| 扎兰屯市| 收藏| 西华县| 稷山县| 富宁县| 大悟县| 康保县| 云和县| 通河县| 西充县| 本溪| 象山县| 安阳市| 连平县| 新昌县| 甘洛县| 竹溪县| 南木林县| 额济纳旗| 辉县市| 偃师市|