JVM学习笔记05-对象的实例化内存布局与访问定位

本文深入探讨了JVM中对象的实例化过程,包括new、反射、clone、反序列化等方式,并详细阐述了对象内存布局的细节。同时,分析了对象访问定位的两种策略——句柄访问和直接指针访问,讨论了各自的优缺点。对于Java开发者,理解这些概念有助于优化内存管理和提高程序性能。

目录

1、对象的实例化

2、对象的内存布局

3、对象访问定位


PDF版笔记:JVM的学习笔记PDF版-互联网文档类资源-优快云下载

1、对象的实例化

创建对象的方式:

  1. new(单例模式、工厂模式也是其变形方式)
  2. 反射:Class的newInstace():在JDK9 中不建议使用,只能调用空参public的构造器
  3. 反射:Constructor的newInstace(Xxx):可以调用任意参数的构造器(没有权限要求)
  4. 使用clone():不调用任何的构造器,当前类需要实现Cloneable接口,实现clone()
  5. 使用反序列化:从文件、网络中获取一个对象的二进制流,并还原为对象
  6. 第三方库Obieneisi:

创建对象的步骤:

  1. 判断对象对应的类是否加载、链接、初始化并加载
  2. 为对象分配内存(如果内存规则--指针碰撞,如果内存不规则--JVM需要维护一个空闲列表分配)
  3. 处理并发安全问题(采用CAS失败重试、区域加锁保证更新的原子性,TLAB技术)
  4. 初始化分配到的空间--堆属性赋默认值
  5. 设置对象头
  6. 执行init方法进行初始化:显示初始化、代码块中初始化、构造器中初始化

2、对象的内存布局

3、对象访问定位

Q:JVM是如何通过栈帧中的对象引用访问到其内部的对象实例的呢?

A:定位,通过栈上reference访问堆空间的实例

访问的两种方式:

句柄访问:

  • Java栈本地变量表中保存了reference的句柄地址
  • 在堆空间中,开辟了句柄池。一个对象对应一个句柄。句柄记录:到对象实例数据的指针(堆内对象)、到对象类型数据的指针 (元空间内类)

优缺点:

  • 优:对象发生移动是,对象的reference不需要发生修改,比较稳定
  • 缺:需要独立开辟一个空间,对于资源有浪费

直接指针(Hotspot采用):

  • Java栈本地变量表中保存了reference的对象实例的地址
  • 在对象实例数据中保存了对象类型的指针

优缺点:

  • 优:可以直接引用
  • 缺:在对象移动时需要实时修改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值