对象创建过程

这里说的对象创建过程,仅仅指的是普通的对象。创建对象,仅仅只是一个new关键字。

  1. 查找是否有符号引用:当虚拟机接收到一个new 指令时,会去常量池里面去找有没有这样到一个符号引用。
  2. 是否被加载:判断这个符号引用是否已经被加载链接初始化。如果没有,要先执行类的加载过程。
  3. 分配内存:分配内存的时候需要注意线程安全问题,为了避免同一块内存地址被分配给对象的问题。
    1. 主要有两种方式来避免
      1. CAS:采用cas乐观锁失败重试的方式来保证原子性
      2. TLAB:TLAB就是内存分配发生在对应的线程内,发生在不同的物理空间上。每个线程会预先在内存堆中划分好一部分的内存空间。称为本地线程分配缓冲(Thread Local Allocation Buffer,TLAB).分配内存时就在预先分配的内存中进行。当TLAB内存用完,需要重新划分TLAB时,才需要同步锁。
    2. 分配内存的策略主要有以下两种
      1. 空闲列表:空闲列表主要适用于内存空间不规整的场景。也是内存回收策略是标记-清除的算法场景。内存里面需要维护一个列表,用于记录哪些内存被使用,哪些内存是空闲的。分配内存的时候需要在列表中查找一个相等大小的内存区域。并修改列表状态。
      2. 指针碰撞:指针碰撞主要适用于内存空间比较规整的场景。也就是说内存回收策略里面使用了标记-整理算法的场景。已经使用的内存放在一边,未使用的内存放在另外一边。中间放着一个指针作为分界点的指示器。分配内存时,只需要移动指针,移动一段和对象大小相等的距离。
  4. 初始化对象头信息:包括元数据,分代回收信息,对象哈希码。
  5. 执行init 构造函数:执行new 指令后,会执行构造函数,按照程序做初始化。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值