1. 程式人生 > >Java物件的位元組大小計算

Java物件的位元組大小計算

計算Java物件的位元組大小

Java基本型別長度及對應物件的位元組長度

基本型別 長度 the size of an object
Int 4 16
Short 2 16
Long 8 24
Byte 1 16
Character 1 16
Float 4 16
Double 8 24
System.out.println("Integer: " + ObjectSizeCalculator.getObjectSize(Integer.valueOf
(122))); System.out.println("Long: " + ObjectSizeCalculator.getObjectSize(Long.valueOf(122L))); System.out.println("Double: " + ObjectSizeCalculator.getObjectSize(Double.valueOf(122.22))); System.out.println("Float: " + ObjectSizeCalculator.getObjectSize(Float.valueOf(122.22f))); System.out.println("Boolean: "
+ ObjectSizeCalculator.getObjectSize(Boolean.valueOf(false))); System.out.println("Character: " + ObjectSizeCalculator.getObjectSize(Character.valueOf('a'))); System.out.println("Short: " + ObjectSizeCalculator.getObjectSize(Short.valueOf("1"))); System.out.println("Byte: " + ObjectSizeCalculator.getObjectSize
(Byte.valueOf("1"))); System.out.println("Date: " + ObjectSizeCalculator.getObjectSize(new Date())); System.out.println("Timestamp: " + ObjectSizeCalculator.getObjectSize(new Timestamp(System.currentTimeMillis()))); Map<String, Object> map = new HashMap<>(); map.put("11", 11); map.put("22", "22"); map.put("33", 33L); map.put("44", 44.44); System.out.println("Map: " + ObjectSizeCalculator.getObjectSize(map));

結果:

Integer: 16
Long: 24
Double: 24
Float: 16
Boolean: 16
Character: 16
Short: 16
Byte: 16
Date: 24
Timestamp: 32
Map: 512

ObjectSizeCalculator類

jdk.nashorn.internal.ir.debug.ObjectSizeCalculator.getObjectSize(Object obj)

java物件在記憶體中的結構

  • java物件在記憶體中的結構

    這裡寫圖片描述

    • 物件頭(Mark Word)用於儲存物件自身的執行時資料, 如雜湊碼(HashCode)、GC分代年齡、鎖狀態標誌、執行緒持有的鎖、偏向執行緒ID、偏向時間戳等等
    • Class物件指標:Class物件指標的大小也是4個位元組,其指向的位置是物件對應的Class物件(其對應的元資料物件)的記憶體地址
    • 物件實際資料:這裡麵包括了物件的所有成員變數,其大小由各個成員變數的大小決定,比如:byte和boolean是1個位元組,short和char是2個位元組,int和float是4個位元組,long和double是8個位元組,reference是4個位元組
    • 對齊:最後一部分是對齊填充的位元組,按8個位元組填充
  • Java Integer物件的記憶體結構

    這裡寫圖片描述

  • Java Array物件的記憶體結構

    這裡寫圖片描述

    • 注意:陣列物件和其他物件稍有不同,因為資料有一個長度length欄位,所以在物件頭後面還多了一個int型別的length欄位,佔4個位元組,接下來才是陣列中的資料