1.对象创建
(1)给对象分配内存
指针碰撞,适用于内存规整的情况
空闲列表,用一个表记录内存的使用情况
(2)线程安全性问题,在高并发情况下,多个线程为对象申请内存可能会出现冲突,即分配了同一块地址,解决方案
线程同步
本地线程分配缓冲ThreadLocalBuffer
(3)初始化对象
将分配的内存初始化成零值
(4)执行构造方法
执行用户自定义的构造函数
2.对象的结构
(1)对象头Header
自身运行时数据:哈希值 GC分代年龄 锁状态标志 线程持有的锁 偏向线程id 偏向时间戳
类型指针:指向类型元数据,对于数组还会存储长度
(2)InstanceData
对象实例的数据,相同宽度的字段被分到一起
(3)Padding(对齐填充)
虚拟机规范规定,对象的大小必须是8k的整数倍,所以当对象大小不足8k的整数倍时,用来进行内存对齐
3.对象的访问定位
(1)使用句柄
先指向堆内存中句柄池的一块地址,再指向对象的真实地址
(2)直接地址直接指向对象的堆内存地址
但不论是使用句柄还是直接地址,都保存有到对象实例数据的指针和到对象类型数据的指针