Java创建对象的过程
- image.png
类加载检查
- 虚拟机遇到new指令时,会去常量池定位整个类的符号引用,并且检查类是否被加载过,解析和初始化过,如果没有就执行相应的加载过程
分配内存
分配空间的大小在
类加载完成后
便可以得知分配内存有
指针碰撞
和空闲列表
两种-
通过
Java堆
是否规整
决定使用不同的分配方式指针碰撞
- 适用场景:
堆内存规整
(没有内存碎片) - 原理:将用过的内存全部整合到一边,没用过的整合到另一边,中间一个分界值指针,只需要沿着未用过的空间
移动到与对象大小相等的距离
。 - GC收集器:Serial,ParNew
空闲列表
- 使用场景:
堆内存不规整
的情况 - 虚拟机会维护一个列表,该列表中会记录哪些内存块是可用的,在分配的时候,找一块足够大的内存来划分给对象实例
- GC收集器:CMS
- 适用场景:
初始化零值
- 内存分配完成后,虚拟机需要将分配到的
内存空间都初始化为零值
,保证对象在不赋初值便可以使用
设置对象头
- 虚拟机需要对对象进行必要设置,如何才能找到类的元数据信息,对象的哈希码,对象的GC分代信息
执行init方法
- 把对象的字段按照自定义的方式进行初始化