详解java程序一个new的过程

在java的世界里,只要当我们去创建一个对象时,都是通过关键字去new的,那么当我们写完这个new之后,我们的程序是怎么帮我们生成这个对象的呢?带着这个问题,我们一起来讨论一下:

首先当虚拟机接受到new的字节码指令的时候,先要去常量池中,看能否找到这个类的符号引用信息;当我们没有找到的这个信息的时候,就会去执行这个类的加载信息过程;加载完成后,java虚拟机就会给我们创建的对象去分配内存。

分配内存的方式有两种:

  • 指针碰撞:就是对内存空间分成完整的两部分,一部分是已使用的内存块,一部分是未使用的内存块,分配内存时,就是通过移动指针的位置,来分配内存。
  • 空闲列表:内存空间,已使用部分和未使用部分,没有明确的划分,相互交错在一起。这个时候需要去维护一个列表,来表明那些是已存在的数据,那些是未使用的数据。

内存分配完成之后,就需要给对象的数据设置默认值:对于String的默认值就是为null,Integer的默认只就是0;然后就会对对象的头信息进行赋值:如GC分代信息,锁信息等;

上述操作都完成后,就会执行构造方式去设置实体属性的值。至此一个对象就在内存中完成了创建。其流程图如下所示:

详解java程序一个new的过程