首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 中獲取變量佔用記憶體大小的正確方法

     編輯:程式設計綜合問答

基本類型大小固定

類型位元位元組
byte81
short/char162
int/float324
long/double648
boolean~1 (JVM 實作相關)~1

char a = '漢'; 佔 2 位元組(UTF-16 代碼單元),但補字符可能佔 4 位元組(兩個 char)。

物件大小估算

Java 無 sizeof 運算子。可用以下方式估算:

  1. Instrumentation API(需啟動參數 -javaagent):
    public class ObjectSizeAgent {
      public static Instrumentation inst;
      public static void premain(String args, Instrumentation inst) { ObjectSizeAgent.inst = inst; }
      public static long sizeOf(Object o) { return inst.getObjectSize(o); }
    }
  2. JOL (Java Object Layout) 庫:
    System.out.println(ClassLayout.parseInstance(new Object()).toPrintable());
  3. Runtime 粗略估算:
    Runtime rt = Runtime.getRuntime();
    long before = rt.totalMemory() - rt.freeMemory();
    Object obj = new MyObject();
    long after = rt.totalMemory() - rt.freeMemory();
    System.out.println("約 " + (after - before) + " bytes");

陣列與字串

  • 陣列物件頭部 + 長度 + 元素大小總和。
  • String 內部為 char[](Java 9+ 為 byte[] + coder),大小 = 物件頭 + 陣列引用 + 陣列物件頭 + 字元資料。

注意事項

  • JVM 物件頭通常 12-16 位元組(64 位元壓縮指針 12B)。
  • 記憶體對齊通常按 8 位元組。
  • GC、逃逸分析、壓縮指針等優化會影響實際佔用。

對於精確分析,建議使用 JOL 或 jcmd GC.heap_dump 配合 MAT 分析堆轉儲檔。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved