深入理解JVM(补充章) 对象创建过程、对象的内存布局、对象访问定位

对象创建过程、对象的内存布局、对象访问定位

对象的创建过程

1. 对象所属类的加载
首先检查对象所属类及其父类是否被类加载器加载到方法区,如果没有加载则涉及到类的加载,这里类加载还涉及到双亲委派机制

类加载过程、双亲委派机制可以参考我同分类下“深入理解JVM第一章”

2. 为对象在堆空间存储分配空间
这里又涉及到两个情况:

  • 内存规整:如果内存是规整的,那么虚拟机采用的是指针碰撞法来为对象分配内存。所谓指针碰撞法就是记录当前内存中存储的数据的末尾位置,如果新数据进来则从这个位置开始继续存储,然后指针更新定位到新数据存储的末尾位置。
  • 内存不规整:如果内存是不规整的,则虚拟机会维护一个空闲列表,列表里记录了哪些内存是空闲的,新数据需要存储的时候会去空闲列表找一个可用的内存。
    ps:内存是否规整取决于采用的GC算法是否具有标记整理的功能。

3. 处理并发安全问题

  • 采用CAS失败重试、区域加锁保证更新的原子性
  • 每个线程预先分配一块TLAB

4. 初始化分配到的空间
初始化对象属性的默认初始值

5. 设置对象的对象头
下面介绍内存布局会具体介绍对象头

6. 执行init方法初始化
给属性显式初始化赋值

对象的内存布局

1. 对象头
在这里插入图片描述
2. 实例数据
实例数据是对象存储的真正的有效信息,包括程序代码中定义的各种类型的字段(包括从父类继承的字段)

3. 对齐填充
起到占位符的作用,比如定义一个盒子,这个盒子放这个对象的所有信息,然后没放完的地址,进行填充。

对象的访问定位

在这里插入图片描述
创建一个对象是为了引用它,那么如何引用呢?
两种方式:

  1. 句柄访问
    在这里插入图片描述

  2. 直接指针
    在这里插入图片描述
    ps:hotspot采用的是直接指针的方式

觉得不错记的点个赞,谢谢!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值