JVM篇-对象的实例化内存布局与访问定位

本文详细探讨了JVM中对象实例化的各种方式,包括new、反射、克隆和反序列化。进一步阐述了创建对象的六个步骤,强调了类加载、内存分配、对象头设置和初始化的重要性。同时,分析了对象内存布局的三个部分:对象头、类型数据和对象填充。最后,介绍了对象访问定位的句柄访问和直接访问两种策略,其中HotSpot VM采用直接访问。
摘要由CSDN通过智能技术生成

对象实例化

在这里插入图片描述

创建对象的方式

  1. new
  2. Class的newInstance()(反射==>之能调用空参构造器,权限是public )
  3. Constructor的newInstance(xxx)==>可以空参、带参、权限没有要求
  4. 使用clone()
  5. 反序列化:从网络获取对象的二进制流
  6. 第三方库Objenesls

创建对象的步骤

字节码的角度的创建

在这里插入图片描述

从执行角度看(细致分为6个步骤)

在这里插入图片描述

  1. 判断对象对应的类是否加载、链接、初始化

虚拟机接收到一条new的指令,首先去检查这个指令的参数能否在MetaSpace的常量池中定位到一个类的符号引用,并且见这个符号引用是否已经被加载,解析和初始化。如果没有使用类加载器加载

  1. 为对象分配内存
    2.1. 内存模型规整–指针碰撞
    2.2 内存模型不规整— 虚拟机维护一个列表 空闲列表分配
  2. 处理并发问题(采用CAS失败重试,区域佳作保证更新原子性)or (每个线程预先分配一块TLAB)
  3. 初始化分配到的空间(设置所有属性的默认值,保证对象实例字段在不赋值的时间可以直接调用)
  4. 设置对象头(将对象所属类(既类的元数据信息)、对象的HashCode和对象的GC信息、锁信息等数据村塾在对象头中)
  5. 执行init方法进行显示初始化。

对象的内存布局

在这里插入图片描述

1.对象头(Header)

运行时元数据(Mark Word)

  • 哈希值(HashCode)
  • GC分代年龄
  • 锁状态标志
  • 线程持有的锁
  • 面向线程ID
  • 偏向时间戳

类型指针

执行元数据Instace Class 确定该对象所属的类型

2.类型数据(Instance Data)

  • 相同宽度的字段总是被分配到一起
  • 父类中定义的变量会出现子类之前

3. 对象填充(Padding)

占位符

例如

在这里插入图片描述

对象的访问定位

句柄访问

在这里插入图片描述

直接访问(HotSpot使用)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值