一个'长'的大小在内存中 - Java

时间:2016-03-17 14:12:38

标签: java memory heap-memory visualvm

的评价

  1. size-of-a-byte-in-memory-java
  2. byte-in-java-takes-4-bytes-by-default
  3. 我仍在尝试弄清楚为什么 long double 消耗 12 bytes 而不是内存中的 8 bytes

    当然在某处有错误的假设;请指导我..

    我用两种方法分析了它,

    1. Java VisualVM enter image description here
    2. Java Instrumentation基于memory-measurer
    3. 以下是我的逻辑/假设/来源信息,

      1. 在类中定义单个float或long属性并检查其内存占用
      2. 对象将携带自己的元数据12 bytes = [CLASS INFO OF 4 BYTES] + [FLAGS INFO OF 4 BYTES] + [LOCK INFO OF 4 BYTES]
      3. 班级大小为Total Memory - Meta Data
      4. 收到的结果为12 bytes => 24 bytes (Total Memory) - 12 bytes (Meta Data)
      5. JDK:1.8.0_65; Java HotSpot(TM)64位服务器VM
      6. 操作系统:Windows 8.1
      7. Test program
      8. [ ANSWER ] 4字节的差异是由于JVM的Padding应用。谢谢安迪特纳......

2 个答案:

答案 0 :(得分:1)

引用this answer

  

在现代的64位JDK中,一个对象有一个12字节的头,填充到8个字节的倍数

额外的4个字节是填充以获得8的倍数。

答案 1 :(得分:0)

你可以检查双倍的大小:

double numDouble=2;
long size=(long)(numDouble*Double.SIZE) / Byte.SIZE;
System.out.println(size);

输出:16