Java对象的创建过程
在上一篇文章中我们已经了解到JVM的内存模型,其中的每个部分的大致描述和作用,那么在JVM中的对象又是如何进行创建的呢?下面就让我们一起学习一下。
Java创建对象的方法
Java中有几种创建对象的方式?这也是经常见到的一道面试题,很重要哦!
- 第一种肯定是我们用的最多的new关键字了。
- 第二种是通过Java的反射机制,cls.newInstance()来创建对象。
- 第三种就是通过克隆方式来复制一个已经存在的对象。
- 第四种是通过调用构造器的newInstance()方法
- 第五种就是我们很少用的实例化方法
如果小伙伴们还不知道这五种方法具体如何实现,请点击这里。
对象的创建过程
当我们写下一个简单的new关键字之后,虚拟机在运行时如何来处理的呢?
- 首先JVM去检查这个new指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化。
- 如果上一步中的类没有被加载、解析和初始化,那就必须先执行相应的类加载过程。
- 如果类加载检查通过,则JVM将为新生对象分配内存。这里分配内存的方式又包括“指针碰撞”和“空闲列表”两种方式。
- 在多线程中频繁的创建对象,是非线程安全的,解决方法包括:CAS+失败重试,另一种就是TLAB(Thread Local Allocation Buffer)也叫本地线程分配缓存。
- 内存分配完成后,JVM将分配到的内存空间都初始化为零值(不包括对象头),如果使用TLAB,该工作可以提前至TLAB分配时进行。该步骤保证了对象的实例字段在Java代码中可以不赋值就直接使用,程序能访问到这些字段的数据类型所对应的零值。
- 对对象进行一些必要的设置。比如该对象的类的实例、元数据信息、哈希码、GC分代年龄等,这些信息存放在对象头中。
- 执行init方法,把对象按照我们的意愿进行初始化,产生一个真正可用的对象。