【发布时间】:2016-07-03 22:49:57
【问题描述】:
已审核
我仍在试图弄清楚为什么 long 和 double 在 Java 中使用 12 bytes 而不是 8 bytes在内存中
肯定有错误的假设;请指导我..
我用两种方法分析过,
以下是我的逻辑/假设/来源信息,
- 在类中定义单个浮点或长属性并检查其内存占用情况
- 对象将携带自己的元数据,价值
12 bytes = [CLASS INFO OF 4 BYTES] + [FLAGS INFO OF 4 BYTES] + [LOCK INFO OF 4 BYTES] - 班级人数为
Total Memory - Meta Data - 收到的结果是
12 bytes => 24 bytes (Total Memory) - 12 bytes (Meta Data) - JDK:1.8.0_65; Java HotSpot(TM) 64 位服务器虚拟机
- 操作系统:Windows 8.1
- Test program
[ANSWER] 4 个字节的差异是由于 JVM 应用了 Padding。谢谢安迪·特纳...
【问题讨论】:
-
@AndyTurner 但在
DoubleClass和LongClass内部有原始的long和double变量。 -
@radoh
DoubleClass和LongClass有自己的元数据,价值 12 字节 + 8 字节原语long或double+ 4 字节填充 => 总共 24 字节。我无法知道图片中的 4 个字节是从哪里来的。内存填充是安迪的正确答案.... :)
标签: java memory heap-memory visualvm