2017-10-20 7 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 

QUESTION 1:は、私は、オブジェクトの多くの種類で実験やフィールドは決して少ない12次に相殺ことに驚きました12って何?いくつかの予約オブジェクトメタデータ?

質問2:またIは、データ構造のメモリalignementが4または8バイトに等しくなければならないと考えました。しかし、なぜb1のオフセットが19であるのか?このUnsafe::fieldOffsetの出力をどのように解釈するのですか?

P.S.これは教育目的のみであり、本番環境での使用を目的としたものではありません。

答えて

4

"一部の予約オブジェクトのメタデータ?"はい。

"データ構造のメモリ配列は4バイトまたは8バイトでなければなりません。"オブジェクト全体については、はい、ただし必ずしも個々のフィールドではありません。

+0

この場合、 'Test'のアラインメントを推定する方法はありますか? –

+0

Btw、非常に興味深い...なぜbフィールド18のオフセットがありますか?最初のものとして置いても? –

+0

(すべてのメタデータを使用して)オブジェクトのレイアウトを監視するツールをお勧めしますか? –