首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 對象內存佔用計算方法詳解

     編輯:Java 相關知識

Java 對象在堆內存中的佈局

在 HotSpot JVM 中,每個對象在堆內存中由四個部分組成:

  • A:對象頭 — 存儲對象的運行時數據(哈希碼、GC 分代年齡、鎖狀態等)。普通對象佔 8 字節,數組對象佔 12 字節(含長度字段)。
  • B:基本類型字段 — 按類型佔用固定字節:boolean/byte 1B,char/short 2B,int/float 4B,long/double 8B。
  • C:引用類型字段 — 每個引用佔 4 字節(32 位 JVM 或開啟壓縮指針的 64 位 JVM)。
  • D:填充字節 — 對象總大小必須是 8 字節的倍數,不足部分自動填充。

具體計算示例

類定義佔用字節數說明
class Empty {}8僅對象頭 8B
class OneBool { boolean b; }16對象頭 8B + boolean 1B + 填充 7B
class EightBools { boolean b1...b8; }16對象頭 8B + 8×boolean 8B = 16B,恰好對齊
class Mixed { int i; Object ref; }24對象頭 8B + int 4B + ref 4B = 16B,填充 8B 對齊到 24B

特殊情況說明

  • 逃逸分析與標量替換:JIT 編譯器可能將未逃逸的對象拆解為局部變量存放在棧上,不在堆分配。
  • 同步鎖狀態:對象頭中鎖標記位會隨輕量級/重量級鎖膨脹而變化,影響對象頭大小(但通常仍計為 8B)。
  • 壓縮指針:64 位 JVM 默認開啟 -XX:+UseCompressedOops,引用仍為 4B;關閉後變為 8B。

實用技巧

可使用 jol-core (Java Object Layout) 工具在運行時精確測量對象大小:

<dependency>
  <groupId>org.openjdk.jol</groupId>
  <artifactId>jol-core</artifactId>
  <version>0.16</version>
</dependency>

// 使用示例
System.out.println(ClassLayout.parseClass(MyClass.class).toPrintable());
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved