创建
- new
- 检查new指令的参数,是否能在常量池中定位到一个类的引用符号
- 检查该类是否被加载、解析和初始化。 没有则执行相应的过程
- 分配内存 存在2中情况。取决于java内存堆是否规则
a。指针碰撞 连续的只要移动指针即可 Serial、ParNew Compact等带有压缩整理的 使用此方法
b。空闲列表 ; CMS 基于Mark-Sweep算法的 收集器的时候。 - 考虑是否线程安全
a: 同步,保证原子性
b:本地线程分配缓冲 TLAB Thread Local Alloction Buffer 只有TLAB用完 才同步 - 内存空间初始化为零值
- 对象头 (hash码 是否有偏向锁, GC分代信息 元数据等
对象头
a: 哈希码,分代年龄
b:锁,偏向锁,偏向ID
对象的访问定位
- 句柄
- java栈本地变量表中 reference指向句柄,句柄指向实例数据和类型数据
- reference存放的是稳定的句柄地址
- 对象移动只会改变句柄中的实例数据指针,不改变reference
- 直接指针访问
- 速度快
- 节省开销