java - JVM 前 4 个 boolean 值优化,而不是第 5 个

标签 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

显然前 4 个 boolean 值以某种方式被塞进了对象 header ,这是怎么回事?

注意:使用 Oracle JDK1.7 和 JDK1.8 进行测试,64 位,在 Linux x64 上运行。

最佳答案

没有进行优化;对象 header 通常为 8 或 12 个字节,具体取决于 VM 和模式(Compressed OOPS on/off)。此外,内存粒度通常为 8 字节(内存中的对象大小必须始终是粒度的倍数)。

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

关于java - JVM 前 4 个 boolean 值优化,而不是第 5 个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25810548/

相关文章:

java - 持久化 Java CI-Bayes 对象

ios - 我的动画 JPG 不会发布

serialization - boost::serialization 序列化过程中内存消耗高

java - 在 Karaf 上设置 4096MB 以上的堆内存

clojure - 衡量 Clojure 程序使用多少内存的最佳方法是什么?

Java Swing 窗口未出现在 Eclipse 中

java - Jersey 客户端处理 JSON 数据

Java Applet 未在网页上加载

c++ - 在需要之前避免初始化成员

java - CLASSPATH 变量是隐式的吗?