<!-- 用于查看当前线程锁的状态 分析JVM中Object布局 -->
<dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.7.1</version> </dependency>
新建一个对象,放入内存中的堆。内存里的一个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());
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContextTest.xml"); Person personTest = (Person) ac.getBean("personTest");//有成员变量 System.out.println(ClassLayout.parseInstance(personTest ).toPrintable());
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<Integer> list=new ArrayList<>(); list.add(123); list.add(456); System.out.println(ClassLayout.parseInstance(list).toPrintable());
原文:https://www.cnblogs.com/zxj-study/p/13057490.html