java类对象的创建与内存分配机制

文章详细阐述了Java中对象创建的流程,包括类的加载检查、内存分配(指针碰撞与空闲表法)、并发问题的解决(CAS和TLAB)、初始化默认值以及设置对象头,最后执行初始化方法。这些步骤涉及到了JVM内存管理、线程安全及对象生命周期的关键环节。
摘要由CSDN通过智能技术生成

对象创建的主要流程:
在这里插入图片描述

1.类的加载检查
当虚拟机遇到一个new指令时,会去元空间中找寻你需要创建的类,并判断该类是否已经被加载,如果没有则先进行加载

2.分配内存
在确定需要创建的类已经被加载的之后,需要根据对象的大小,为他分配一块空间,对象的大小在类被加载完之后就可以确定
这个步骤有两个问题
1.如何划分内存
2.并发分配问题
划分内存有两种方式:
1)指针碰撞
如果java堆中的内存时绝对规整的,所有使用过的内存都放在一边,没有使用过的内存放在另外一边(标记-整理算法),中间放着一个指针作为分界线,分配内存的时候只需要将该指针向后一段与对象大小相等的距离即可
2)空闲表法
在java堆中如果内存不是规整的,已使用和未使用的空间交错分布,那就没有使用指针碰撞了,需存储一个空闲列表,将可以使用的内存空间位置存储在空闲列表上,需要分配空间的时候,在空闲列表上找到足够大小的空间,并将该位置标记成已分配

解决并发问题:
1)CAS
虚拟机采用CAS加上失败重试的机制保证更新操作的原子性来对分配内存空间的动作进行同步处理
2)本地线程分配缓冲(TLAB)
把内存分配的动作,按照不同的线程分配在不同的空间当中,即每个线程在堆中预先分配一块空间,通过-XX:+/-UseTLAB参数来设定虚拟机是否使用TLAB(JVM会默认开启-XX:+UseTLAB),-XX:TLABSize 指定TLAB大小。

3.初始化默认值
内存分配完成后,虚拟机需要将分配到的内存空间都初始化为零值(不包括对象头), 如果使用TLAB,这一工作过程也可以提前至TLAB分配时进行。这一步操作保证了对象的实例字段在Java代码中可以不赋初始值就直接使用,程序能访问到这些字段的数据类型所对应的零值。

4.设置对象头
在初始化零值之后,虚拟机还要对对象进行必要的设置,列如对象是哪个类的实例,如何也可以找到对象的元数据信息、对象的哈希码,对象的GC分代年龄等,这些信息存放在对象头的Object Header当中。
在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、 实例数据(Instance Data)和对齐填充(Padding)。 HotSpot虚拟机的对象头包括两部分信息,第一部分用于存储对象自身的运行时数据, 如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时 间戳等。对象头的另外一部分是类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。
32位对象头
在这里插入图片描述

5.执行init方法
对象进行初始化,可以对应成对象的属性赋值和调用构造方法等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值