1。概要
一部のブログでは、Javaのメモリレイアウトは3つの部分に分かれていると言われていますが、これをどのように確認しますか?または、Javaオブジェクトのメモリレイアウトを印刷する方法は?
以下に、このクラスの使用について説明します
最初にこのパッケージを紹介します
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.10</version>
</dependency>
次に、クラスを作成します
public class L {
private boolean flag = false;
}
次に、テストクラスは次のとおりです。
@Test
public void printAble(){
L l = new L();
System.out.println(ClassLayout.parseInstance(l).toPrintable());
}
次のように見ることができます
com.java.lock.obj.head.L object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1)
4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)
8 4 (object header) a3 1c 01 f8 (10100011 00011100 00000001 11111000) (-134144861)
12 1 boolean L.flag false
13 3 (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 3 bytes external = 3 bytes total
ここで分析すると、3object header
つがそれぞれ4バイトを占め、次にブール値が1バイトを占めることがわかります。javaにはオブジェクトが必要なため、これらの合計は3 * 4 + 1 = 13バイトです。
- 少なくとも8バイト
- オブジェクトは8の整数倍でなければなりません
したがって、最後の3バイトはオブジェクト整列されます。
クラスを作成していることを確認しましょう。ただし、クラスはInt型です。
public class L {
private int flag ;
}
次に、テストクラスを実行し、次のように印刷します
@Test
public void printAble(){
L l = new L();
System.out.println(ClassLayout.parseInstance(l).toPrintable());
}
次のように見ることができます
OFFSET SIZE TYPE DESCRIPTION VALUE
0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1)
4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)
8 4 (object header) a3 1c 01 f8 (10100011 00011100 00000001 11111000) (-134144861)
12 4 int In.flag 0
Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total
正確にintは4バイトを占有し、結果は正確に16バイト、8の倍数になるため、オブジェクトの入力操作はありません。