Java对象是如何创建出来的?
创建一个Java对象还不简单?new一下就出来了:Object obj = new Object();
不过,我相信,读者既然进来阅读这篇文章,想必是不满足于仅仅掌握创建Java对象的基本语法,而是要知其然也要知其所以然。下面,让我们一起来看看,对象是怎么创建出来的:
1、JVM进行类加载检查
当Java虚拟机(JVM)执行new指令时,首先会检查类是否已被加载、解析和初始化过。如果没有,则通过JVM类加载子系统进行加载。
2、为新生对象分配内存
当类加载检查通过之后,JVM会根据已加载的类信息在Java堆中划分一块确定大小的内存给新生对象。JVM给对象分配内存是一项复杂的任务,我会在《JVM内存分配机制》当中做详细讲解。
3、将分配的内存空间初始化为不包括对象头的零值
内存分配完成后,JVM需要将分配到的内存空间都初始化为零值(不包括对象头), 如果使用TLAB,这一工作过程也可以提前至TLAB分配时进行。这一步操作保证了对象的实例字段在Java代码中可以不赋初始值就直接使用,程序能访问到这些字段的数据类型所对应的零值。
4、为新生对象设置对象头
初始化零值之后,JVM要对对象进行必要的设置,例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的GC分代年龄、对象的锁状态等信息,这些信息就是包含在所谓的对象头中,对象头是存储在对象内存布局中的一部分。在Java中,开发人员无法直接设置对象头,因为对象头是由Java虚拟机自动管理的。对象头的设置和管理是由Java虚拟机在对象创建和销毁时自动处理的。
5、 执行<init>方法
执行<init>方法,即对象按照程序员的意愿进行初始化。对应到语言层面上讲,就是为属性赋值(注意,这与上面的赋零值不同,这是由程序员赋的值),和执行构造方法。