在java中创建对象通常是用一个new关键字,那么此时java虚拟机都做了什么呢?今天简单的看了一下,这里的对象指普通java对象,不包括数组和Class对象。
当虚拟机遇到一条new 指令时,会执行一下操作:
首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否已经被加载、解析和初始化过,如果没有,那么必须先执行相应的类加载过程。
在类加载检查通过后,接下来虚拟机将为新生对象分配内存,对象所需内存的大小在类加载完成后便可以完全确定。
接下来虚拟机要对对象进行必要的设置,例如这个对象是哪个类的实例、对象的哈希码、对象的GC分代年龄等信息,这些信息存放在对象的对象头之中。
在上面工作都完成之后,从虚拟机的角度看,一个新的对象已经产生了,但从java程序的角度看,对象创建刚刚开始,还没有执行init方法,所有的字段都还为零。一般情况下执行完执行完new指令之后会接着执行init方法,把对象按照程序员的意愿进行初始化,这样一个真正可用的对象才算完全产生出来。