对象的创建步骤

-
类加载检查,虚拟机遇到new指令的时候,首先去检查这个指令的参数在常量池中是否有相对应的符号引用,然后再检查这个符号引用是否被加载,解析,执行过,如果没有,那么就要先执行此类的加载过程
-
分配内存 通过类加载检查后就由虚拟机为新生对象分配内存,一个对象所分配的内存大小,在类加载完成后就能确定了。
分配方式有指针碰撞和空闲链表两种方式,具体是哪种要取决于堆内存空间是否规整,而是否规整又要取决于采用的是哪种垃圾收集器
在分配内存的时候存在多线程安全问题,解决方法是在堆内存中有每个线层对应的TLAB,在TLAB中分配内存,如果分配的对象大于剩余内存,那么就采用CAS+失败重试的方式 -
初始化零值,内存分配以后,虚拟机将所分配的内存空间全部初始化0值,保证了对象的字段在java代码中可以不赋初值就可以被直接使用
-
设置对象头,虚拟机为对象设置对象头,例如对象的哈希码,GC分代年龄,以及是哪个类
-
执行init(),一般而言,在执行完new指令后都会执行init方法,把对象按照我们的意愿去初始化,这样一个可用的对象才算完全产生出来
本文为学习笔记,参考资料比较多,所以无法附上全部链接,若个别篇幅涉及侵权,请及时与本人联系,删除或附加链接.

浙公网安备 33010602011771号