每日一个知识点:new 一个对象过程

- 日理万妓 2022-12-10 14:58 177阅读 0赞

1、 加载验证

验证是否被加载过,是否能在常量池找到一个类的符号引用,并且这个符号引用代表的类有没有被加载、解析、和初始化过,没有的话执行类加载流程。

2、 内存分配

对象所需内存的大小在类加载完成后便可完全确定。
由垃圾回收器决定分配的方式,有指针碰撞( parnew serial)和 空闲列表( cms)两种。
为了安全的分配对象,内部会有两种分配方式,使用 CAS + 重试,另一种是本地线程缓冲分配TLAB,只有TLAB分配完了才需要同步锁定。
虚拟机必须将分配到的内存空间(但不包括对象头)都初始化为零值,如果使用了TLAB的话,这一项工作也可以提前至TLAB分配时顺便进行。

3、设置对象头

比如 锁状态: 偏向、轻量级锁、重量级、GC年龄、hash码(会在真正调用Object::hashCode()时才计算)

4、执行init 初始化

也就是调用对象的构造方法,给对象进行真正的赋值。(这里有个点,就是对象访问定位。比如从栈中怎么访问对象,两种方法: 句柄:引用稳定、 直接指针:速度快(hotspot))

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,177人围观)

还没有评论,来说两句吧...

相关阅读

    相关 如何new一个对象

    在JavaScript中,可以使用new操作符来创建一个对象。 举个例子,假设我们要创建一个名为"Person"的构造函数,它有两个属性:"name"和"age"。我们可以这

    相关 13 New一个对象过程

    new一个对象时发生了什么? JVM遇到一条new指令时,首先会先查看对象所属的类有没有被加载到内存,如果没有的话,就会先通过类的全限定名来加载。加载并初始化类完成

    相关 JAVA new对象过程

    我们都知道,创建对象是由 new关键字调用构造方法 返回类实例。先实例化对象,再把对象初始化。 例如 : Person jack = new Person(); 这句话到底