对象的创建
- 对象的序列化或者克隆都是调的new
- 查看类的信息是否在方法区中,并且已经加载、解析、初始化过
- 确定对象的内存大小,类的信息算出来
- 分配内存:
- 指针碰撞:适用规整的内存空间,直接执行后移
- 空闲列表:不规整的,需要维护空闲列表,分配,hotspot默认方式
- 为了减少竞争条件,每个线程都有一个TLAB,只有TLAB分配完了,才去堆中申请新的TLAB内存空间(启发:生成分布式ID的方式)
- 设置对象的头部信息,调用init初始化对象
对象的内存信息
- 头对象
- 存储hashcode、分代年龄、对象锁、类型指针等
- 实例数据:对象变量数据
- 对其填充:8字节整数倍,利于管理22
对象的访问定位
- 句柄:2次引用,对象移动时,不需要修改线程本地变量表
- 直接指针:1次引用,速度快,hotspot默认方式