如何計算Java物件佔用了多少空間?
在Java中沒有sizeof運算子,所以沒辦法知道一個物件到底佔用了多大的空間,但是在分配物件的時候會有一些基本的規則,我們根據這些規則大致能判斷出來物件大小。
物件頭
物件的頭部至少有兩個WORD,如果是陣列的話,那麼三個WORD,內容如下:
- 物件的HashCode,鎖資訊等
- 到物件型別資料的指標
- 陣列的長度(如果是陣列的話)
規則
首先,任何物件都是8位元組對齊,屬性按照[long,double]、[int,float]、[char,short]、[byte,boolean]、reference的順序存放,舉個例子:
public class Test { byte a; int b; boolean c; long d; Object e; }
如果這個物件的屬性按照順序存放的話,要佔用的空間為:head(8) + a(1) + padding(3) + b(4) + c(1) + padding(7) + d(8) + e(4) + padding(4) = 40。但是按照這個規則得到:head(8) + d(8) + b(4) + a(1) + c(1) + padding(2) + e(4) + padding(4) = 32。可以看到節省了不少空間。
在涉及繼承關係的時候有一個最基本的規則:首先存放父類中的成員,接著才是子類中的成員,舉個例子:
class A { long a; int b; int c; } class B extends A { long d; }
這樣存放的順序及佔用空間如下:head(8) + a(8) + b(4) + c(4) + d(8) = 32。那如果父類中的屬性不夠八個位元組怎麼辦?這樣就有了新的一條規則:父類中最後一個成員與子類的第一個成員的間隔如果不夠4個位元組,此時需要擴充套件到4個位元組的基本單位,舉個例子:
class A { byte a; } class B extends A { byte b; }
那麼此時佔用的空間如下:head(8) + a(1) + padding(3) + b(1) + padding(3) = 16。顯然這種方式比較浪費空間,那麼就有了:如果子類的第一個成員是double或者long,並且父類並沒有用完8個位元組,JVM會破壞規將較小的資料填充到該空間,舉個例子:
class A { byte a; } class B extends A { long b; short c; byte d; }
此時佔用的空間如下:head(8) + a(1) + padding(3) + c(2) + d(1) + padding(1) + b(8) = 24。
相關文章
- 【HotSpot】一個java物件佔多少空間HotSpotJava物件
- 如何檢視某個查詢用了多少TempDB空間
- Oracle檢視物件佔用空間Oracle物件
- 計算一個表佔用的空間的大小
- Java陣列物件佔用多少個位元組?Java陣列物件
- PHP陣列到底佔用多少記憶體空間PHP陣列記憶體
- 空間距離計算
- oracle中用sql計算一個表佔用的空間的大小OracleSQL
- 如何使Xcode佔用更少的空間 Xcode佔用空間太大解決方法XCode
- 【scipy 基礎】--空間計算
- 如何計算自動管理的UNDO表空間大小
- 計算時間,指定時間的多少個月後
- 檢視一個User所有物件佔用的空間大小物件
- 資料庫硬碟空間如何算資料庫硬碟
- oracle查詢表空間的空間佔用情況Oracle
- py 計算去年,明年,多少天前的時間
- 計算2個日期間有多少個自然周
- 計算兩個NSDate之間,相隔多少秒數
- C++中struct的空間計算C++Struct
- 地理空間距離計算優化優化
- java計算間隔天數Java
- undo表空間佔用磁碟空間滿案例處理
- php 計算兩個日期之間相差多少天PHP
- Java 中,如何計算兩個日期之間的差距?Java
- 對oracle資料表空間的計算Oracle
- 計算表空間使用率指令碼指令碼
- 空間資料庫三維空間兩點距離計算錯誤資料庫
- Oracle審計--AUD$佔用空間較大處理方案Oracle
- 一道阿里面試難題:如何計算JAVA物件大小?阿里面試Java物件
- MacPro系統佔用空間太大Mac
- AWR佔用sysaux表空間太大UX
- oracle 日誌檔案佔空間Oracle
- win10怎麼看資料夾所佔空間的大小 windows10如何檢視檔案所佔空間大小Win10Windows
- java中堆與棧 java中資料佔用記憶體空間的大小Java記憶體
- 【SQLServer】Tempdb空間異常增長,空間佔用非常大SQLServer
- Oracle查詢表佔磁碟空間大小及移動表空間Oracle
- onethink上傳到空間之後,runtime資料夾將空間佔滿如何解決
- Java String 物件,你瞭解多少?Java物件