JVM对象创建过程

151 阅读2分钟

对象创建的过程:

类加载检查-->分配内存-->初始化值-->设置对象头-->执行init方法

image.png

(1) 类加载检查:

首先会检查类是否被加载过,如果没有则需要先进行类的加载过程

(2) 分配内存:

两种方式(指针碰撞,空闲列表),分配内存的方式由Java堆是否规整决定,
而Java堆是否规整又由垃圾回收策略决定,即:标记-删除方式会产生内存碎片,
则只能用空闲列表方式分配内存,而标记-压缩方式,Java堆中规整,则使用指针碰撞的方式分配内存

image.png

(3) 内存分配的并发问题:

在并发的情况下,JVM通过两种方法保证线程安全。

第一种方式为:CAS+失败重试机制,CAS是乐观锁的一种实现,所谓乐观锁,就是在并发请求中,假设没有冲突则直接访问,假设由冲突则进行重试,直到没有冲突的时候再访问

第二种方式为:TLAB,为每个线程在Eden区域预先分配一块内存,当线程中对象创建时,使其先加入到Eden区域中,当对象大小大于Eden区域或者Eden区域内存已满则考虑使用CAS实现

(4) 初始化零值:

JVM在对象分配完内存后会对内存空间都初始化为0值,也就是属性为什么能有默认值直接,能直接用

(5) 设置对象头:

虚拟机对对象的设置,比如哈希码,GC分代年龄等

(6) 执行init方法:

当前对象的字段默认都为0,所以要想按照需求把需要的对象创建出来,还需要调用init方法,
把对象按照需求创建出来,至此才真正创建一个对象