【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

这里分析,可以看到 3个object header 每个占用4个字节,然后下面是boolean占用一个字节,这些总共 3*4+1=13个字节,因为java 要求对象

  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