- 类加载检查,检查类是否被加载解析初始化过,如果没有就执行类加载
- 分配内存。为新生对象分配内存,有
指针碰撞
和空闲列表
两种方式
指针碰撞
:使用过的内存放到一遍,未使用的内存放到一边,中间使用一个指针来分界,分配内存的时候将指针向未分配的一侧移动 。适用于内存规整的情况下
空闲列表
:维护一个列表,记录哪块内存是可用的,分配的时候选择一块内存分配,并在表中记录。适用于内存不规整的情况
Java 堆内存是否规整,取决于垃圾回收算法,"标记-清除"和“复制算法”是不规整的,"标记-整理"是规整的
内存分配的并发问题:
CAS+失败重试:
TLAB:本地线程分配缓冲,给每个线程预先分配一小块内存,当给对象分配内存时,先在TLAB分配,空间不足时 再进行
CAS+失败重试
- 初始化零值。
- 设置对象头。(哈希值、分代信息、锁、…)
- 执行init方法