世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。
- 虚拟机遇到new指令以后,会首先查看指令对应的参数在常量池中有没有对应的符号引用,然后查看这个符号引用对应的类有没有进行类加载、解析和初始化过程,如果没有则进行类加载。
- 类加载完成以后,需要为对象在堆内存中分配内存空间,主要有两种方式,一种是“指针碰撞”(空间规整,使用的空间与未使用空间明确分隔,可以通过指针移动分配内存空间),一种是“空闲列表”(使用空间与未使用空间混合,需要维持一个列表记录空间,然后根据列表记录的空闲空间进行分配)。
- 但是在多线程高并发情况下,都会出现线程安全问题,有两种解决方式,一种是线程同步(CAS+失败重试),另一种是本地线程分配缓冲(在堆中为每一个线程分配一段内存,每个线程创建对象时,优先在本线程的内存中分配,如果内存空间不足,再通过线程同步的方式分配)。
- 对象内存分配完成以后,还需要将分配的内存初始化为0,这样在使用时有了初始值;然后还要写入对象头信息,如分代年龄、锁信息等。这样虚拟机层面的对象创建就完成了。
- 然后就是语言层面的通过构造方法()构造对象。
- 在语言层面构造对象,根据依赖关系,先父类后子类。然后一个对象就构造出来了。