2
我想了解Java中的對象以及它們如何駐留在內存中。我可以與下列應用試驗:瞭解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:此外我認爲該數據結構的存儲器alignement應等於4或8個字節。但是,爲什麼B1的抵消是19,例如?如何解釋這Unsafe::fieldOffset
輸出?
P.S.這僅用於教育目的,不適用於生產。
有沒有一種方法可以估計'Test'在這種情況下的對齊? –
順便說一句,非常有趣...爲什麼'b'字段18的偏移?即使它作爲第一個? –
您能否建議一些監視對象佈局的工具(包含所有元數據)? –