JOL全称为Java Object Layout,是分析JVM中对象布局的工具

java对象的组成部分:

  • 1.对象头
    在jvm虚拟机中每一个java对象都有一个对象头,对象头中包含标记字段以及对象指针,标记字段用来储存hash码、gc信息以及锁信息,而指针则指向改对象的类。在64位jvm虚拟机中这两部分都是64位的,所以也就是需要128位大小(16 bytes)。
    注意:64位虚拟机中在堆内存小于32GB的情况下,UseCompressedOops是默认开启的,该参数表示开启指针压缩,会将原来64位的指针压缩为32位。
  • 2.实例数据
    类中所有的实例字段数据。
  • 3.内存填充部分(alignment)
    该部分作用是用来保证java对象在虚拟机中占内存大小为8N bytes。
  • 4.数组长度
    这个是数组对象才特有的。

java的基础数据类型所占内存情况如下表格:

boolean byte short char int long float double
1 bytes 1 bytes 2 bytes 2 bytes 4 bytes 8 bytes 4 bytes 8 bytes

 

要使用JOL工具,先引入依赖:

        <!--Java Object Layout -->
        <dependency>
            <groupId>org.openjdk.jol</groupId>
            <artifactId>jol-core</artifactId>
            <version>0.11</version>
        </dependency>

测试代码如下:

public class TestJOL {
  public static void main(String[] args) {
    Object o = new Object();

    System.out.println(ClassLayout.parseInstance(o).toPrintable());
  }
}

运行结果:

java.lang.Object 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)                           e5 01 00 f8 (11100101 00000001 00000000 11111000) (-134217243)
     12     4        (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

从运行结果可以看到一个Object对象实例在内存中占16字节。

 

 

相关文章:

  • 2021-09-26
  • 2022-12-23
  • 2021-11-03
  • 2021-10-24
  • 2021-11-03
  • 2021-09-20
  • 2021-10-04
  • 2021-05-10
猜你喜欢
  • 2021-12-30
  • 2022-12-23
  • 2021-12-06
  • 2022-12-23
  • 2021-07-08
  • 2021-11-14
  • 2021-07-07
相关资源
相似解决方案