程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 盤算一個Java對象占用字節數的辦法

盤算一個Java對象占用字節數的辦法

編輯:關於JAVA

盤算一個Java對象占用字節數的辦法。本站提示廣大學習愛好者:(盤算一個Java對象占用字節數的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是盤算一個Java對象占用字節數的辦法正文


本文實例講述了若何盤算(或許說,預算)一個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法式設計的懂得。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved