[Java] Javaでオブジェクトのメモリレイアウトを表示する方法

ここに写真の説明を挿入

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バイトです。

  1. 少なくとも8バイト
  2. オブジェクトは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の倍数になるため、オブジェクトの入力操作はありません。

おすすめ

転載: blog.csdn.net/qq_21383435/article/details/110727931