首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JVM前4个布尔优化,而不是第5个

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

Stack Overflow用户
提问于 2014-09-12 14:24:42
回答 3查看 136关注 0票数 4

目前,我正在使用Eclipse内存分析器插件(使用标准的jconsole hprof转储)分析一些Java应用程序,并注意到计算对象大小的一些奇怪结果:

代码语言:javascript
复制
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个布尔人被塞进了对象头中,这是怎么回事?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-12 14:37:46

在64位HotSpot JVM内使用CompressedOops。

  • 对象头由8字节markWord +4字节instanceKlass引用组成。
  • boolean字段占用1字节
  • 对象是8字节对齐的。

那是

  • 空对象占据align8(8 + 4) = 16 bytes
  • 一个具有4个布尔字段的对象占用align8(8 + 4 + 4*1) = 16 bytes
  • 一个具有5个布尔字段的对象占用align8(8 + 4 + 5*1) = align8(17) = 24 bytes
票数 3
EN

Stack Overflow用户

发布于 2014-09-12 14:33:20

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

您的结果清楚地表明,您的VM使用了一个12字节的头;因此,由于粒度的原因,可以容纳4个字节,而不会增加内存占用。布尔值通常表示为字节;因此,在您的示例中添加第五个字节需要17个字节(12个头+5个字节)四舍五入到下一个粒度,8边界为24个字节。

票数 5
EN

Stack Overflow用户

发布于 2014-09-12 14:41:08

我没看到你是什么。使用1.8,来自Netbeans:

代码语言:javascript
复制
public static class C1 {
    boolean a,b,c,d;
}
public static class C2 {
    boolean a,b,c,d,e;
}
public static void main(String[] args) {
    try {
           Constructor<Unsafe> unsafeConstructor = Unsafe.class.getDeclaredConstructor();
           unsafeConstructor.setAccessible(true);
           Unsafe unsafe = unsafeConstructor.newInstance();
           String[] fieldNames = new String[] {"a","b","c","d"};
           for (String fieldName : fieldNames) {
           System.out.println(fieldName+": "+unsafe.objectFieldOffset(C1.class.getDeclaredField(fieldName)));
        }
    }
    catch(Exception e) {
       e.printStackTrace();
    }
 }

产生结果

代码语言:javascript
复制
a: 12
b: 13
c: 14
d: 15

...which表示每个布尔值在对象中占据单独的字节偏移量。标头为12个字节。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25810548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档