对象的创建过程
当虚拟机遇到一条含有new的指令时,会进行一系列对象创建的操作:
检查常量池中是否有即将要创建的这个对象所属的类的符号引用;
- 若常量池中没有这个类的符号引用,说明这个类还没有被定义!抛出ClassNotFoundException;
- 若常量池中有这个类的符号引用,则进行下一步工作;
进而检查这个符号引用所代表的类是否已经被JVM加载;
- 若该类还没有被加载,就找该类的class文件,并加载进方法区;
- 若该类已经被JVM加载,则准备为对象分配内存;
根据方法区中该类的信息确定该类所需的内存大小;
一个对象所需的内存大小是在这个对象所属类被定义完就能确定的!且一个类所生产的所有对象的内存大小是一样的!JVM在一个类被加载进方法区的时候就知道该类生产的每一个对象所需要的内存大小。从堆中划分一块对应大小的内存空间给新的对象;
分配堆中内存有两种方式:- 指针碰撞
如果JVM的垃圾收集器采用复制算法或标记-整理算法,那么堆中空闲内存是完整的区域,并且空闲内存和已使用内存之间由一个指针标记。那么当为一个对象分配内存时,只需移动指针即可。因此,这种在完整空闲区域上通过移动指针来分配内存的方式就叫做“指针碰撞”。 - 空闲列表
如果JVM的垃圾收集器采用标记-清除算法,那么堆中空闲区
- 指针碰撞