深入理解JVM(二)——揭开HotSpot对象创建的奥秘

这里写图片描述

对象的创建过程

当虚拟机遇到一条含有new的指令时,会进行一系列对象创建的操作:

  1. 检查常量池中是否有即将要创建的这个对象所属的类的符号引用;

    • 若常量池中没有这个类的符号引用,说明这个类还没有被定义!抛出ClassNotFoundException;
    • 若常量池中有这个类的符号引用,则进行下一步工作;
  2. 进而检查这个符号引用所代表的类是否已经被JVM加载;

    • 若该类还没有被加载,就找该类的class文件,并加载进方法区;
    • 若该类已经被JVM加载,则准备为对象分配内存;
  3. 根据方法区中该类的信息确定该类所需的内存大小;
    一个对象所需的内存大小是在这个对象所属类被定义完就能确定的!且一个类所生产的所有对象的内存大小是一样的!JVM在一个类被加载进方法区的时候就知道该类生产的每一个对象所需要的内存大小。

  4. 从堆中划分一块对应大小的内存空间给新的对象;
    分配堆中内存有两种方式:

    • 指针碰撞
      如果JVM的垃圾收集器采用复制算法或标记-整理算法,那么堆中空闲内存是完整的区域,并且空闲内存和已使用内存之间由一个指针标记。那么当为一个对象分配内存时,只需移动指针即可。因此,这种在完整空闲区域上通过移动指针来分配内存的方式就叫做“指针碰撞”。
    • 空闲列表
      如果JVM的垃圾收集器采用标记-清除算法,那么堆中空闲区
  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值