[关闭]
@frank-shaw 2015-11-07T00:58:47.000000Z 字数 559 阅读 3454

Person p = new Person();到底做了些什么

java.内存


1.当虚拟机遇到一条new的指令的时候(讨论普通的JAVA对象创建,不包括数组和CLASS对象)首先会去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号的引用代表的类是否已经被加载,解析和初始化过。如果没有,则需先执行相应的类加载过程:查找到该类文件的路径,并通过对应的类加载器完成加载过程。如果有直接的父类的情况下,会先加载该类的父类。

2.检查(类加载的第二步“连接”中有验证这一步,即为检查)都通过之后,JVM将为新的对象分配内存。对象所需要的大小在类加载完成之后都可以确定。为对象分配空间等同于把一块确定大小的内存从JAVA堆中划分出来。

3.内存分配完成之后,虚拟机需要将分配到的内存空间都进行虚拟化为零值。这一步操作保证了对象的类字段(static变量)在Java代码中可以不赋初始值就可以使用。实际上这就是类加载的第二步“连接”中的准备阶段。

4.执行到类加载的“初始化”这一步,类变量被赋予相应的不同的值。这一步就是< cinit>阶段。

5.调用对应的构造函数进行初始化(< init>阶段),此时重点对应的是普通变量。在构造函数中,第一行会先到调用父类中构造函数进行初始化。

6.初始化完毕后,将地址值赋值给引用变量.

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注