JVM优先4个布尔优化,而不是第5个

Lau*_*ire 4 java memory jvm micro-optimization

我目前正在使用Eclipse Memory Analyzer插件(使用标准的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
Run Code Online (Sandbox Code Playgroud)

显然前4个布尔值以某种方式被塞在对象标题中,这是怎么回事?

注意:在Linux x64上运行的Oracle JDK1.7和64位JDK1.8进行了测试.

Dur*_*dal 5

没有进行优化; 对象头通常是8或12字节大,具体取决于VM和模式(压缩OOPS开/关).通常,内存粒度为8个字节(内存中的对象大小必须始终是粒度的倍数).

您的结果清楚地表明您的VM使用12字节标头; 因此,由于粒度而没有增加对象内存占用空间,因此有4个字节的空间.布尔值通常表示为字节; 所以在你的情况下添加第5个需要17个字节(12个标题+ 5个字节)四舍五入到下一个粒度8边界给出24个字节.