使用JOL工具查看内存布局

本文介绍了Java对象布局工具JOL,如何通过Maven引入并使用它来查看对象的内存占用,包括对象头、指针压缩以及synchronized锁在对象头中的记录。通过实例展示了如何计算对象大小和理解对象头结构。
摘要由CSDN通过智能技术生成

给大家推荐一个可以查看普通java对象的内部布局工具JOL(JAVA OBJECT LAYOUT),使用此工具可以查看new出来的一个java对象的内部布局,以及一个普通的java对象占用多少字节
引入maven依赖

<dependencies>
        <!-- https://mvnrepository.com/artifact/org.openjdk.jol/jol-core -->
        <dependency>
            <groupId>org.openjdk.jol</groupId>
            <artifactId>jol-core</artifactId>
            <version>0.9</version>
        </dependency>
    </dependencies>

测试

package com.cctv;

import org.openjdk.jol.info.ClassLayout;


public class TestJOL {
    public static void main(String[] args)  {
        Object obj = new Object();
        System.out.println(ClassLayout.parseInstance(obj).toPrintable());
    }
}

  1. 利用jol查看64位系统java对象(空对象),默认开启指针压缩,总大小显示16字节,前12字节为对象头e58fb8492bcb5b88acac50f75c31d342_1694.png
  • OFFSET:偏移地址,单位字节;
  • SIZE:占用的内存大小,单位为字节;
  • TYPE DESCRIPTION:类型描述,其中object header为对象头;
  • VALUE:对应内存中当前存储的值
  1. 关闭指针压缩后,对象头为16字节:-XX:-UseCompressedOops
    06188355c7a3aaa6f4187a3f950c2ed2_1688.png

思考: 下面例子中obj对象占多少个字节?

基本数据类型:

TypeBytes
byte,boolean1
char,short2
int,float4
long,double8
package com.cctv;

import org.openjdk.jol.info.ClassLayout;

public class ObjectTest {
    public static void main(String[] args) throws InterruptedException {
        Object obj = new Test();
        //查看对象内部信息
        System.out.println(ClassLayout.parseInstance(obj).toPrintable());
    }
}

class Test {
    private long p;
}

image.png

回到之前的问题: synchronized加锁加在对象上,对象是如何记录锁状态的?
锁状态被记录在每个对象的对象头的Mark Word中

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值