首页 > 试题广场 >

说说类的实例化过程

类加载--分配内存--初始化0值--状态设置--构造函数
发表于 2022-07-05 17:22:00 回复(0)
1.在堆上分配一块内存区域; 2.对象数据初始化; 3.将符号引用(上诉代码中的 node )指向堆内的实际内存地址
发表于 2022-08-02 17:09:25 回复(0)
在JVM中,对象的创建遵循如下过程: 1.类加载:当JVM遇到一条字节码new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。 2.分配内存。对象所需内存的大小在类加载完成后便可完全确定,为对象分配空间的任务实际上便等同于把一块确定大小的内存块从Java堆中划分出来。 3.初始化零值:内存分配完成之后,虚拟机必须将分配到的内存空间都初始化为零值,这步操作保证了对象的实例字段在Java代码中可以不赋初始值就直接使用,使程序能访问到这些字段的数据类型所对应的零值。 4.状态设置:接下来,虚拟机还要对对象进行必要的设置,例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的GC分代年龄等信息。这些信息存放在对象的对象头之中。根据虚拟机当前运行状态的不同,对象头会有不同的设置方式。 5.构造函数:Class文件中的`<init>()`方法还没有执行,所有的字段都为默认的零值,对象需要的其他资源和状态信息也还没有按照预定的意图构造好。 一般来说,new指令之后会接着执行`<init>()`方法,按照程序员的意愿对对象进行初始化,这样一个真正可用的对象才算完全被构造出来。 </init></init>
发表于 2022-10-11 16:51:19 回复(0)
类加载--分配内存--初始化--状态设置--构造函数
发表于 2022-09-05 14:57:23 回复(0)
类实例化的过程。类加载,分配内存,初始化零值状态设置构造函数。
发表于 2022-07-19 17:05:33 回复(0)
类的实例化过程需要 JVM会检查此类是否已加载,若否则: 1、类加载 2、分配内存 3、初始化0值(对分配的内存初始化成0) 4、状态设置(类名,对象的hash码,对象GC分代年龄等) 5、构造函数(<init>方法)</init>
发表于 2022-12-04 20:55:56 回复(0)
在JVM中,对象的创建遵循如下过程:当JVM遇到一条字节码new指令时,首先会去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成后便可完全确定,为对象分配空间的任务实际上便等同于把一块确定大小的内存块从Java堆中划分出来。内存分配完成之后,虚拟机必须将分配到的内存空间都初始化为零值,如果使用了TLAB的话,这一项工作也可以提前直TLAB分配时顺便进行。这步操作保证了对象的实例字段在Java代码中可以不赋初始值就直接使用,使程序能访问到这些字段的数据类型所对应的零值。接下来,虚拟机还要对对象进行必要的设置,例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的GC分代年龄等信息。这些信息存放在对象的对象头之中。根据虚拟机当前运行状态的不同,如是否启动偏向锁等,对象头会有不同的设置方式。在上面工作都完成之后,从虚拟机的视角来看,一个新的对象已经产生了,但是从Java程序的视角来看,对象创建才刚刚开始——构造函数,即Class文件中的init()方法还没执行,所有的字段都为默认的零值,对象需要的其他资源和状态信息也还没有按照预订的意图构造好。一般来说,new指令之后会接着执行init()方法,按照程序猿的意愿对对象进行初始化,这样一个真正可用的对象才能完全被构造出来。
发表于 2022-07-25 12:04:15 回复(0)
类的实例化过程是类加载,分配内存,初始化零值,设置对象头,执行init方法 类加载:虚拟机遇到一条new指令时,首先会在常量池中寻找是否有该类的符号引用,并且查找被符号引用的类是否被加载,连接,初始化过,如果没有,就必须执行类加载过程 分配内存:为新生对象分配内存,在类加载过程后确定了对象的大小,分配内存空间的任务就等同于在堆中查找一块对象大小的内存并划分出来。内存分配有两种方式,分别为指针碰撞和空闲列表,具体使用那种方式取决于内存是否规整,而内存是否规整取决于垃圾收集器采用的算法。 指针碰撞:使用场景:内存规整 原理:将内存划分为两块,被使用过的内存整合到一块,没有被使用过的内存放入另一快,中间有一个临界指针,指向未被使用过的内存快中对象大小的内存 GC收集器:serial,parBew 空闲列表:使用场景:不规整的内存 原理:维护一块列表,记录没有被使用过的内存空间,当分配时,寻找一块足够大的内存分配给对象实例,并更新空闲列表 GC收集器:CMS 内存分配并发问题:创建对象毕竟频繁,需要包装线程安全,有以下两张解决方式 1CAS加失败重试:CAS的原理是在操作之前,与原先值比较,如果相同则更新值,如果不同一直使用CAS重试直至成功 TLAB:为每一个线程在堆中分配一块eden区,JVM再给对象分配内存时,现在TLAB中分配,当要分配对象的大小大于TLAB剩余的内存大小时,采用CAS加失败重试 初始化零值:内存分配之后,虚拟机将分配到的内存空间初始化为零值,这就保证了java对象在不被赋初始化值就可以直接使用 设置对象头:在初始化零值之后,需要对对象进行必要的设置,例如这个对象是哪个类的实例,怎么找到类的元数据信息,对象的哈希码,对象的GC分代年龄等,都存储在对象头中 执行init方法:按照程序员的意愿对对象进行初始化赋值
编辑于 2024-05-19 21:19:38 回复(0)
第一步:申请内存,里边值设置为默认值(半初始化); 第二步:调用构造方法,设置初始值; 第三步:建立关联;
发表于 2023-03-01 20:22:15 回复(0)
m
发表于 2022-10-12 15:31:07 回复(0)
类加载->分配内存->初始化0值->状态设置->构造函数
发表于 2022-09-01 15:51:37 回复(0)
1. 加载类:先检查这个类有没有被JVM加载,没有的话就按照类的加载流程加载、连接、初始化 2. 分配内存:在堆中为对象分配内存,包括对象头和对象本身所占的空间 3. 初始化:**给实例变量赋初值**,静态变量在类加载的时候已经初始化了 4. 执行构造方法 5. 返回引用地址
发表于 2024-05-23 17:09:36 回复(0)
当进行对象的实例化时,先会检查当前类是否被加载,如果没有则进行下一步 堆中分配实例对象的大小,分配内存时初始化零值,状态设置,在实例对象的头中设置属于哪个类,哈希值,GC分代年龄 调用构造函数进行init函数,使用程序猿的意图进行初始化
编辑于 2024-04-02 18:34:28 回复(0)
类加载:在进行new对象时,检查类是否被加载 在堆中分配内存 初始化值 状态设置:在实例对象的对象头中进行设置哪个类,哈希值,GC分代年龄 构造函数:调用init函数,根据程序员意图进行初始化
编辑于 2024-03-16 15:46:09 回复(0)
编辑于 2024-03-08 14:50:40 回复(0)
类加载 分配内存 初始化0值 状态设置 构造函数
编辑于 2024-03-05 20:36:06 回复(0)
类加载--分配内存--初始化静态变量--符号引用替换成直接引用--执行初始化 完成整个实例化过程
编辑于 2024-03-05 14:46:22 回复(0)
类加载-在堆分配内存-初始化0值-状态设置-构造函数
发表于 2024-01-01 21:37:14 回复(0)
主要分为一下几个步骤: ● 类加载检查 ● 类加载 ● 对象内存分配 ● 对象内存初始化 ● 设置对象头
发表于 2023-11-02 11:50:06 回复(0)
类加载,内存分配,初始化赋值,设置状态,构造函数
发表于 2023-09-20 12:13:35 回复(0)