理解Java中的对象

时间:2017-10-20 20:01:35

标签: java object

我试图理解Java中的对象以及它们如何驻留在内存中。我正在尝试以下应用程序:

private static final Unsafe U = getUnsafe();

public static void main( String[] args )
{
    offsets(Test.class);
}

private static <T> void offsets(Class<T> clazz){
    Arrays.stream(clazz.getFields())
       .forEach(f -> 
            System.out.println(f.getName() + " offset:" + U.objectFieldOffset(f)
       )
    );
}

public static class Test{
    public boolean b;
    public byte b1;
    public short b2;
    public int b3;
}

输出:

b offset:18
b1 offset:19
b2 offset:16
b3 offset:12

问题1: 我尝试了许多类型的对象,并且惊讶地发现字段偏移量从不低于12.这是什么12?一些保留对象metadat?

问题2: 此外我认为数据结构的内存对齐应该等于4或8个字节。但是为什么b1的偏移量是19?如何解释这个Unsafe::fieldOffset输出?

P.S。这仅用于教育目的,不适合在生产中使用。

1 个答案:

答案 0 :(得分:4)

“一些保留的对象元数据?”是。

“数据结构的内存对齐应该等于4或8个字节。”对于整个对象,是的,但不一定是单个字段。