Jol-分析Java对象的内存布局

Jol-分析Java对象的内存布局

Open JDK提供的JOL(Java Object Layout)工具为我们方便分析、了解一个Java对象在内存当中的具体布局情况。本文实验环境为64位HotSpot虚拟机。

Java对象的内存布局

Java的实例对象、数组对象在内存中的组成包括:对象头、实例数据和内存填充。

Jol-分析Java对象的内存布局_第1张图片

  • 对象头主要包括Mark Word、Class对象指针,数组对象还包括数组长度。Mark Word占有8个字节,在Mark Word中记录了哈希码、GC、锁等信息,而Class对象指针则指向该实例的Class对象,在开启指针压缩的情况下占用4个字节,否则占用8个字节,数组对象还需要4个字节用于记录数组长度。
  • 实例数据区域用于存放该对象的数据。
  • 内存填充是指Java对象地址按8字节对齐,每个对象所占内存的字节数必须是8字节的整数倍。

Jol-分析Java对象的内存布局_第2张图片

实例1

  1. 在maven工程中引入JOL相关包

<dependency>
    <groupId>org.openjdk.jolgroupId>
    <artifactId>jol-coreartifactId>
    <version>0.9version>
dependency>
  1. 创建测试类
package org.dsg.threads;

import lombok.Data;
import org.openjdk.jol.info.ClassLayout;

import java.nio.charset.StandardCharsets;

/* 演示对象的内存估算 */
public class OomTooManyObjectTest {

    public static void main(String[] args) {
        /* 对象本身内存 */
        System.out.println(ClassLayout.parseInstance(new Product()).instanceSize());
        //一个字符串占用内存
        String name = "新华社推新作品";
        System.out.println(ClassLayout.parseInstance(name).instanceSize());
        System.out.println(16 + name.getBytes(StandardCharsets.UTF_8).length);
    }

    @Data
    private static class Product{
        private int id;
        private String name;
        private int price;
        private String desc;
    }
}

输出结果:

32
24
37

实例2

  1. 创建测试类
package org.dsg.threads;

import lombok.Builder;
import lombok.Data;
import org.openjdk.jol.info.ClassLayout;

public class OomTooManyObjectTest {

    public static void main(String[] args) {
        Product product = Product.builder()
                .id(1)
                .name("小汽车")
                .price(180000)
                .desc("长安小汽车很Cool")
                .build();
        System.out.println(ClassLayout.parseInstance(product).toPrintable());
        int[] arr = {11, 12, 13};
        System.out.println(ClassLayout.parseInstance(arr).toPrintable());
    }

    @Data
    @Builder
    private static class Product{
        private int id;
        private String name;
        private int price;
        private String desc;
    }
}

输出结果:

Jol-分析Java对象的内存布局_第3张图片

你可能感兴趣的:(java,java,开发语言)