java对象在内存中,java-基础知识-对象-对象在内存中的布局

1.用到的工具包

org.openjdk.jol

jol-core

0.7.1

新建一个对象,放入内存中的堆。内存里的一个Java对象分为三部分:对象头,实例数据,对齐。

普通对象布局:

markword

class pointer

instance data

padding

markword : 8Bytes 用于标记锁信息、GC信息、IdentityHashCode等

Class Pointer 类指针 : jvm开启内存压缩(-XX:+UseCompressedClassPointer),4字节。不开启,8字节。默认开启

用于标记该对象是哪个Class的实例 例如:Object.class

instance data 成员变量: 大小由成员变量的类型和数量而定,如果没有成员变量,则这一块为空

Padding 对齐: 由上述字节而定,一个对象占用的字节数必须是8的倍数,不足的用padding对齐

例1:

Object o=new Object(); //没有成员变量

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

20200606231039145936.png

例2:

ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContextTest.xml");

Person personTest= (Person) ac.getBean("personTest");//有成员变量

System.out.println(ClassLayout.parseInstance(personTest ).toPrintable());

20200606231039560014.png

数组对象布局:

markword : 8Bytes 用于标记锁信息、GC信息、IdentityHashCode等

Class Pointer 类指针 : jvm开启内存压缩(-XX:+UseCompressedClassPointer),4字节。不开启,8字节。默认开启

用于标记该对象是哪个Class的实例 例如:Object.class

数组长度:    4字节 标记数组有多少个元素

数组内容:   根据数组类型m和长度n而定,长度为m*n

如果元素为基本类型,比如byte/boolean/short/char/int/long/double,则m为对应的长度;

如果元素为数组, m是4字节的引用

如果数组长度为0,这一块为空

Padding 对齐: 由上述字节而定,一个对象占用的字节数必须是8的倍数,不足的用padding对齐

ArrayList list=new ArrayList<>();

list.add(123);

list.add(456);

System.out.println(ClassLayout.parseInstance(list).toPrintable());

20200606231039872526.png

另外 markword 中记录了线程锁的状态

20200606231040105934.png

原文:https://www.cnblogs.com/zxj-study/p/13057490.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值