掌握虚拟机创建对象的秘密
|
象等)的创建是怎么一个过程呢? 第一:虚拟机遇到一条new指令时,首先会去检查这个指令的参数是否能够在常量池中定位到一个类的符号引用。然后检查这个符号引用代表的类是否已经被加载、解析和初始化过。如果没有进行类加载则执行相应的类加载的过程。 记住:要new对象,要先加载类! 第二:类加载检查通过后,虚拟机将为新生的对象分配内存。对象所需的内存大小在类加载的时候便可以完全确定(如何确定对象的下文说明) 。为对象分配内存的任务等同于把一块确定大小的内存从Java堆中划分出来。分配方式有 “指针碰撞” 和 “空闲列表” 两种,选择那种分配方式由 Java 堆是否规整决定,而Java堆是否规整又由所采用的垃圾收集器是否带有压缩整理功能决定(对象在堆上的划分,这是个复杂的问题,后文继续探讨,这里只要明白是在对象是在堆上分配内存即可)。 记住:要new对象,要有先分配内存空间! 第三:内存分配完成,虚拟机需要将分配的内存空间都初始化为零值(零值这个概念之前文章也介绍过,这里就不再说明),这一步的操作保证了对象的实例字段在Java代码中可以不赋初始值就直接使用,因为程序能访问这些字段的数据类型对应的零值。 记住:要new对象,虚拟机会帮你为对象的实例字段自动赋予零值! 第四:虚拟机要对对象进行必要的设置,如这个对象是哪个类的实例、如何才能找到类的元数据信息(JDK7是方法区保存)、对象的哈希码、对象的GC分代年龄等信息。这些信息都存放在对象的对象头(Object Header)中。
上面工作都完成之后,在虚拟机看来,一个对象就已经产生了。但是从Java程序的角度看,对象的创建才刚刚开始,因为 记住:对象不是你想new,想new就可以new的!
下面用通过图解的例子简单说明(版本jdk1.7): (编辑:四平站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
