对象的创建

 这里只考虑普通的Java对象,不包括数组和CLass对象。

当虚拟机遇到new指令时,先检查这个指令的参数是否在常量池中定位到类的符号引用。检查这个符号引用代表的类是否已经被加载、解析和初始化过。如果有没,则先执行类加载过程。

 类加载检查通过后,虚拟机为新生对象分配内存-内存大小在类加载成功后即可确定。根据使用的GC收集器是否具有压缩整理功能可分两种方式:一是“指针碰撞”-占用内存和空闲内存在物理上有一个指针作为分界点来分离开来,;二是“空闲列表“-记录哪些内存可用,分配内存的时候找到足够大的内存块,然后更新列表记录。

由于在堆上为对象分配内容是非常频繁的行为,所以在并发为对象分配内存时候会碰到内存分配后,未来得及修改指针记录的情况(如果为对象A在P位置分配内存时,还未来得及对指针进行修改,对象B同时使用了原来的指针分配内存)。解决这个问题有两种方案:一是使用CAS配上失败重试的方式保证更新操作的原子性。另一种是把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在java堆中预先分配一小块内存-本地线程分配缓冲(Thread Local Allocation Buffer-TLAB),只有TLAB用完时,才需要同步锁定。可通过-XX:+/-UseTLAB参数来控制虚拟机是否使用TLAB功能。

内存分配完成后,执行初始化零值操作(如int为0,boolean为false,String为null),此时对象可直接使用。

接下来,虚拟机依据对象头(Object Header)对对象进行必要的设置,例如这个对象是哪个类的示例、找到类的元数据信息、对象的哈希码、对象的GC分代年龄。根据运行状态,设置偏向锁等信息。

new执行成功后,执行<init>方法,对对象进行初始化,一个真正的对象产生了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值