我试图理解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。这仅用于教育目的,不适合在生产中使用。
答案 0 :(得分:4)
“一些保留的对象元数据?”是。
“数据结构的内存对齐应该等于4或8个字节。”对于整个对象,是的,但不一定是单个字段。