JVM(三) 对象的创建过程
2024-08-26 22:52:39
1.对象的创建过程
1.1 . 给对象分配内存
对象的内存分配有两种方式,一种是指针碰撞另外一种是空闲列表的方式,堆是否规整由我们垃圾回收器来决定的 ,如果垃圾回收带有我们的压缩算法,那么他会规整的分配我们的对象。
1.1.1 指针碰撞
我们内存分配为规整的,每次分配依靠指针位移来分配对象,如果在多线程创建对象的情况下是通过在CPU硬件层面上加锁CAS锁来保证数据安全,如图下所示
1.1.2 空闲列表
堆内部有一个列表来存储我们堆中空闲的地方。我们创建对象则去找列表中对应的空闲区域去创建我们的对象。每个线程创建对象,都会被分配一定的内存缓冲区,当缓冲区不够的时候可能会出现多个线程以同一抢占新的内存空间,这里的抢占也是基于CAS锁实现,如下图
1.2. 规整分配线程安全问题
指针碰撞有线程安全问题使用cas无锁在CPU硬件层面家锁
空闲列表则采用我们的本地线程分配缓存,线程占满则采用我们的cas加锁方式,再去分配本地缓存分配一部分区域。
1.3. 初始化对象
1.4. 执行构造方法
2.对象结构
2.1 Header(对象头)
自身运行时数据(Mark Word)
哈希值 gc分代年龄 锁状态标志 线程持有的锁 分代的好处是可以更具不同的区域进行不同的回收算法 类型指针:当前对象指向那个class对象,对应调用的方法也是调用class对象中的方法 数组长度 只有数组才会有这个值
2.2 InstanceData(对象实例数据)
主要存放属性变量,包括父类属性等。
2.3 Padding(填充数据)
使用数据填充,没有实际的意义 HotStop 虚拟机指定对象大小必须是8个字节的整数倍。如果不是8个字节则,使用此进行填充
3.对象访问定位
对象的访问分为句柄引用和直接指针引用
3.1句柄引用
栈指向到句柄池(保存我们实例对象的地址),使用句柄池就不用改变变量指针应用。
3.2 直接指针引用
直接指针引用速度会比较快。我们的java虚拟机有关常见hotSopt的虚拟机采用的是直接指针引用
最新文章
- 关于e^PI>;PI^e
- 主流手持设备GPU性能比较
- splObjectStroge的作用,实例化一个数组
- Wpf Hyperlink超链接控件使用
- ajax提交表单 验证
- (poj 2502) Subway 最短路
- Jvm 中的 重排序、主存、原子操作
- js取整数、取余数
- python flask 解决中文乱码
- T-SQL 数值函数
- wpf UI 元素类型
- canvas原生js写的贪吃蛇
- Servlet Request 请求转发
- W/MessageQueue: Handler (android.os.Handler) {4241f8f8} sending message to a Handler on a dead thread
- Google Tango SDK下载
- 微软在WPC 2015中为“伙伴们”带来了什么?
- 用sc命令查询系统状态
- windows下Qt5.4.2 for android开发环境配置
- com.android.support冲突的解决办法
- 【原创】 HBase 配置指南
热门文章
- [NOI.AC]NOI2019省选模拟赛 第二场
- 【知识点】同样是消息队列,Kafka凭什么速度那么快?
- fluent中截取任意面的数据
- 范仁义html+css课程---2、html常用标签
- 查看 ssh 攻击 和 攻击成功者
- Python之pygame学习绘制文字制作滚动文字
- 迭代硬阈值类算法总结||IHT/NIHT/CGIHT/HTP
- Unity3D ACT动作游戏《武士2》项目源码附教程
- MGI数据库挖掘 | MGI-Mouse Genome Informatics | InWeb database
- 004 DOM01