【问题标题】:Size of a 'long' in memory - Java内存中“长”的大小 - Java
【发布时间】:2016-07-03 22:49:57
【问题描述】:

已审核

  1. size-of-a-byte-in-memory-java
  2. byte-in-java-takes-4-bytes-by-default

我仍在试图弄清楚为什么 longdouble 在 Java 中使用 12 bytes 而不是 8 bytes在内存中

肯定有错误的假设;请指导我..

我用两种方法分析过,

  1. Java VisualVM
  2. Java Instrumentation 基于memory-measurer

以下是我的逻辑/假设/来源信息,

  1. 在类中定义单个浮点或长属性并检查其内存占用情况
  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 位服务器虚拟机
  6. 操作系统:Windows 8.1
  7. Test program

[ANSWER] 4 个字节的差异是由于 JVM 应用了 Padding。谢谢安迪·特纳...

【问题讨论】:

  • @AndyTurner 但在DoubleClassLongClass 内部有原始的longdouble 变量。
  • @radoh DoubleClassLongClass 有自己的元数据,价值 12 字节 + 8 字节原语 longdouble + 4 字节填充 => 总共 24 字节。我无法知道图片中的 4 个字节是从哪里来的。内存填充是安迪的正确答案.... :)

标签: java memory heap-memory visualvm


【解决方案1】:

引用this answer:

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

额外的 4 个字节被填充以达到 8 的倍数。

【讨论】:

    【解决方案2】:

    你可以检查双精度:

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

    输出:16

    【讨论】:

      猜你喜欢
      • 2013-05-19
      • 2014-01-29
      • 2010-09-18
      • 1970-01-01
      • 2017-11-10
      • 1970-01-01
      • 2011-11-01
      • 2014-12-24
      • 2023-03-31
      相关资源
      最近更新 更多