JVM:对象的创建

在使用java编程的过程中,肯定会经常性的创建对象,在语言层面上,一般只需要直接new出对象即可。但是在java虚拟机中是由一套完整的流程的。

1.当虚拟机遇到一个new指令的时候,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有必须先执行相应的类加载过程;
(类加载过程分为五步:加载、验证、准备,解析和初始化)

2.在类加载检查通过后,接下来虚拟机将为新生对象分配内存;
(分配方式一般有两种:如果java堆规整则采用指针碰撞;如果java堆不规整,则采用空闲列表。
Java堆是否规整是否所采用的垃圾收集器是否带有压缩整理功能决定的)

3.内存分配完成以后,虚拟机需要将分配到的内存空间都初始化为零值;
(这一步保证了对象的实例字段在java代码中不赋初始值就可以直接使用,程序能访问到这些字段的数据类型的所对应的零值)

4.虚拟机要对对象进行必要的设置,这些设置的信息都放在对象的对象头之中。

以上过程完成以后,在虚拟机的角度来看,一个新的对象已经产生了,但是从java程序的视角来看,对象创建才刚刚开始—-初始化方法还没有执行,所有的字段还为零。所以执行new指令以后,会接着执行初始化的方法,把对象按照使用者的意愿进行初始化,这样一个真正可用的对象才算完全生产出来。

猜你喜欢

转载自blog.csdn.net/FateRuler/article/details/82425910