2022-04-11 对象的创建

本文详细阐述了Java对象创建过程中,从类加载到内存分配再到初始化的步骤,涉及类加载检查、内存分配策略(指针碰撞与空闲列表)、线程安全问题解决、对象头信息设置以及程序员的初始化任务。

java 对象的创建过程

  1. 虚拟机在遇到一个new 指令时,首先会去常量池中定位到这个类的符号引用,并且检查这个类是否已经被加载、解析和初始化过,如果没有,那必须先进行相应的类加载的过程。
  2. 类加载检查完成后,开始为对象分配内存
  3. 内存的分配方式有两种:① 指针碰撞:内存是规整的,用过的内存和空间内存用指针隔开,当需要内存时,只需要移动指针即可。② 空闲列表 :内存不是规整的,使用的内存和空闲内存相互交错,虚拟机通过维护一个列表来记录那些内存是可用的,分配内存时从列表中找到相应大小的内存即可。采用哪种分配方式取决于垃圾收集器是否带有压缩整理的功能。一般来说,新生代的垃圾搜集算法是复制-清除,分配内存的方式为指针碰撞老年代的垃圾收集器采用的算法是标记-清除,分配内存的方式是空闲列表(当否老年代中找不到连续的大空间分配内存时就会发生Full GC)。
  4. 分配内存时需要考虑线程安全问题(对象A分配内存时,指针还没来得及修改,这时对象B又使用的原来的指针)。有两种解决方案:① 同步处理:虚拟机采用cas加上失败重试的方式保证分配内存的原子性。② 在java堆中,为每个线程预先分配一小块内存,成为本地线程分配缓冲(Thread Local Allocation Buffer TLAB),只有TLAB用完需要分配新的TLAB时,才需要同步(是否使用TLAB,可以通过参数控制)。
  5. 内存分配完成后,虚拟机将分配到的内存空间都赋值为0,这个操作保证了对象在不赋值的时候也可以直接使用。
  6. 设置对象头中的信息(哪个类的实例,hash码,分代年龄,是否启用偏向锁)。
  7. 对于虚拟机来说,一个对象就创建完成了。对于程序员来说,还需要进行初始化操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值