每日一个知识点:new 一个对象过程
1、 加载验证
验证是否被加载过,是否能在常量池找到一个类的符号引用,并且这个符号引用代表的类有没有被加载、解析、和初始化过,没有的话执行类加载流程。
2、 内存分配
对象所需内存的大小在类加载完成后便可完全确定。
由垃圾回收器决定分配的方式,有指针碰撞( parnew serial)和 空闲列表( cms)两种。
为了安全的分配对象,内部会有两种分配方式,使用 CAS + 重试,另一种是本地线程缓冲分配TLAB,只有TLAB分配完了才需要同步锁定。
虚拟机必须将分配到的内存空间(但不包括对象头)都初始化为零值,如果使用了TLAB的话,这一项工作也可以提前至TLAB分配时顺便进行。
3、设置对象头
比如 锁状态: 偏向、轻量级锁、重量级、GC年龄、hash码(会在真正调用Object::hashCode()时才计算)
4、执行init 初始化
也就是调用对象的构造方法,给对象进行真正的赋值。(这里有个点,就是对象访问定位。比如从栈中怎么访问对象,两种方法: 句柄:引用稳定、 直接指针:速度快(hotspot))
还没有评论,来说两句吧...