2017-10-20 67 views
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.這僅用於教育目的,不適用於生產。

回答

4

「某些保留的對象元數據?」是。 「

」數據結構的存儲器對齊應等於4或8個字節「。對於整體而言,是的,但不一定是針對個別領域。

+0

有沒有一種方法可以估計'Test'在這種情況下的對齊? –

+0

順便說一句,非常有趣...爲什麼'b'字段18的偏移?即使它作爲第一個? –

+0

您能否建議一些監視對象佈局的工具(包含所有元數據)? –