• 对象的创建过程


    对象的创建过程

    基于两个方面回答这个问题:

    ①jvm加载和分配内存。

    java对象初始化。

    1.在实例化一个对象的时候,JVM首先会去检查目标对象是否已经被加载并初始化了

    2.如果没有,JVM需要立刻去加载目标类,然后调用目标类的构造器完成初始化。①目标类的加载是通过类加载器来实现的,主要就是把一个类加载到内存里。②然后初始化的过程,主要是对目标类里面的静态变量、成员变量、静态代码块进行初始化。

    3.当目标类被初始化以后,就可以从常量池里面找到对应的类元信息,并且目标对象的大小在类加载之后就已经确认了,所以这个时候就需要为新创建的对象,根据目标对象的大小在堆内存里面分配内存空间。内存分配的方式一般有两种,一种是指针碰撞,一种是空闲列表,JVM会根据java堆内存是否规整来决定内存分配方式。

    4.接下来,JVM会把目标对象里面的普通成员变量初始化为零值,比如int类型初始化为0,对象类型初始化为null,(类变量在类加载的准备阶段就已经初始化过了)。

    这一步操作主要是保证对象里面的实例字段,不用初始化就可以直接使用,也就是程序能够获得这些字段对应数据类型的零值。

    然后,JVM还需要对目标对象的对象头做一些设置,比如对象所属的类元信息、对象的GC分代年龄,hashcode,锁标志等等。

    完成这些步骤之后,对jvm来说,新对象的创建工作已经完成。但是对于java语言来说,对象创建才算开始。

    接下来要做的,就是执行目标对象内部生成的init方法,初始化成员变量的值、执行构造块、最后执行目标对象的构造方法,完成对象的创建。其中init方法是java文件编译后在字节码文件中生成的,它是一个实例构造器,这个构造器会把语句块、变量初始化、调动父类构造器等操作组织在一起。所以调用init方法能够完成一系列的初始化动作。

    在这里插入图片描述

  • 相关阅读:
    【无标题】
    Matlab之数组字符串函数汇总
    Spring基础元注解@Target、@Retention、@Documented、@Inherited
    Norgen提取试剂盒丨血浆/血清循环和核外RNA提取试剂盒
    OpenShift - 利用容器的特权配置实现对OpenShift攻击,以及如何使用 PSA 和 RHACS 防范风险
    数据结构:AVL树的实现和全部图解
    db.sqlite3
    spring-boot2 + vue2+ element-ui2 + avue 通用架构 xijia-plus (兮家 plus)
    Linux下 生成coredump文件前配置
    Java多线程4种拒绝策略
  • 原文地址:https://blog.csdn.net/weixin_45817985/article/details/133064072