首页 > 编程语言 > 详细

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

时间:2020-06-06 23:10:39      阅读:79      评论:0      收藏:0      [点我收藏+]

1.用到的工具包


<!-- 用于查看当前线程锁的状态 分析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());

 技术分享图片

例2:

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());

技术分享图片

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

技术分享图片



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

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!