JAVA对象创建的过程

JVM对象创建的过程
    对于java程序员来说,我们无时无刻不在创建和使用对象。使用new关键字即可快速创建一个对象,其实在new的背后,JVM为我们完成了很多事情。
    JVM的字节码解释器在读取到NEW的指令时,会先去常量区定位对应类的符号引用, 并且检查符号引用指向的类的信息有没有被加载,解析和初始化过。如果没有则会先进行类的加载过程。
    在对类的检查通过后, JVM会去JAVA堆中进行对象的内存分配,对象的内存大小是在类加载后就能提前完全确定的。在JAVA堆中有两种方式分配对象的内存空间:如果JAVA堆的内存空间是规整的,即所有用过的内存放在一边,未使用过的内存放在另外一边, 而中间则是一个指针作为分界线的指示器,分配对象的内存空间就相当于把指针往未使用过的内存那一边挪一点已知对象大小空间,这种方式就叫做”指针碰撞”; 而对于内存空间不规整的JAVA堆来说, 则需要有一个空闲列表,存放可以使用的内存空间的地址, 当分配内存时, 需要从空闲列表里取出一块合适大小的内存地址分配给对象,然后更新空闲列表即可。一般比如Serial、ParNew等自带压缩整理功能的收集器则使用指针碰撞的方式分配对象空间, 还有一些比如CMS这种使用标记清除算法功能的收集器则使用空闲列表的方式进行对象内存空间分配。
    虚拟机中创建对象是非常频繁的行为, 因此也要考虑并发的问题。假如在给某个指针指向的对象分配内存空间并且还未来得及修改指针时,另一个线程又修改了该指针所指向的对象,这个就是并发问题。解决这个问题有两种方案:一种是在对象修改时进行同步锁定处理,保证更新操作的原子性。还有一种方式是使用本地线程缓冲(Thread Local Allcation Buffer),简称TLAB, 即在JAVA堆中为每个线程划分出一块私有的内存区域,每个线程只在自己的缓冲区域进行对象创建。只有当TLAB需要扩展时才进行同步锁定处理。虚拟机是否使用TLAB,可以通过-XX:+/-UseTLAB参数来设定。
    当对象内存分配完毕后, 虚拟机还需要对对象使用到的内存空间进行零值设置。这一操作在使用TLAB的虚拟机中, 可以提前在TLAB中完成, 提高对象创建的速度。这个零值设置是确保JAVA对象在未初始化字段值时也可以使用。
    接下来虚拟机还需要进行对象头信息的设置, 例如一些对象的类信息、哈希码、GC分代年龄信息等。这一系列动作完成后, 对于虚拟机来说,一个对象的创建就完成了。
    但是对于JAVA程序来说, 对象在创建完成后还需要执行init方法, 根据程序员的设定对对象进行一些数据的初始化,这样一个对象的创建才真正的完成。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值