1.类加载查看:
(查看是否被加载过,没被加载过要进行类加载)
首先将去查看这个指令的参数是否能在常量池中定位到这个类的符号援用,并且查看这个符号援用代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执行相应的类加载过程。
2.分配内存:
(把一块内存从堆里调配进去,尺寸在类加载完就可确定,
gc收集器serial、parnew->来源gaodai#ma#com搞*!代#%^码网标记-整顿算法->堆内存规整->指针碰撞调配法->用过的在一边,边上放个指针,分配内存时指针挪一下,
gc收集器cms->标记-革除算法->堆内存不规整->闲暇列表法->保护一个可用区域列表,分配内存时找一块而足够大的中央,而后更新列表)
内存调配并发
CAS+失败重试
TLAB: 为每一个线程在Eden区调配一块儿内存,分配内存时先在这调配,不够了再cas+重试
3.初始化零值:
将调配到的内存空间都初始化为零值(不包含对象头),保障了对象不赋初值就能够间接用
4.设置对象头
对象是哪个类、如何找这个类的元数据信息、对象的哈希码、对象的 GC 分代年龄等信息寄存在对象头中。依据虚拟机以后运行状态的不同,如是否启用偏差锁等,对象头会有不同的设置形式。
5.执行 init 办法
初始化对象