首页 > 技术文章 > 使用JOL工具分析java对象大小

gaopengpy 2020-07-23 11:14 原文

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的基础数据类型所占内存情况如下表格:

booleanbyteshortcharintlongfloatdouble
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字节。

 

 

推荐阅读