【发布时间】:2014-09-12 14:24:42
【问题描述】:
我目前正在使用 Eclipse 内存分析器插件(使用标准 jconsole hprof 转储)分析一些 Java 应用程序,我注意到计算对象大小的一些奇怪结果:
private static class B1 extends B {
} // 16 bytes
private static class B2 extends B {
boolean d1;
boolean d2;
boolean d3;
boolean d4;
} // also 16 bytes!
private static class B3 extends B {
boolean d1;
boolean d2;
boolean d3;
boolean d4;
boolean d5;
} // 24 bytes
显然,前 4 个布尔值不知何故被塞进了对象标题中,这是怎么回事?
注意:使用 Oracle JDK1.7 和 JDK1.8 进行测试,64 位,在 Linux x64 上运行。
【问题讨论】:
-
分析
boolean是一个非常糟糕的主意,因为它们是唯一具有非固定字节大小的原语。 -
默认情况下
-XX:ObjectAlignmentInBytes=8这种简化的对象分配,但是对于小对象它可以有很大的填充。
标签: java memory jvm micro-optimization