jvm学习笔记3--对象的内存布局

6 篇文章 0 订阅

今天是520,不管有没有对象,都要学习呀

在我们经常使用的HotSpot虚拟机中,对象在堆内存中的布局可以分为3个部分:

  • 对象头
  • 实例数据
  • 对齐填充

对象头

对象的对象头包含2类信息:

用于存储对象自身的运行时数据

如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程的id、偏向时间戳等。这些数据的长度在32位和64位虚拟机中,分别占用32bit和64bit,官方称之为"Mark Word"

mark word如图所示:
图片替换文本

类型指针

即对象指向它的类型元数据的指针,jvm通过这个指针确认该对象是哪个类的实例

实例数据

对象真正存储的有效信息,即我们在程序代码中定义的各种字段内容,无论是从父类集成来的,还是子类自有的都必须记录下来。

存储的顺序受jvm的分配策略参数字段在java源码中的定义顺序的影响
HotSpot默认的分配顺序是longs/doubles、ints、shorts/chars、bytes/booleans、opps,可以看到相同宽度的字段会被分配到一起存放,在满足这个条件的前提下,父类的字段放在子类的前面

对齐填充

这部分不是必然的,也没有特殊的含义,仅仅是占位的作用。
由于HotSpot jvm的内存管理系统要求对象的起始位置必须是8字节的倍数,也就是说任何对象的大小都必须是8字节的倍数

从上面可以看到,对象的头部已经是8字节的倍数了,所以如果对象实例没有对齐的,就要通过对齐填充了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值