JVM的内存分配原理

分配前的加载
当使用new关键字创建一个JAVA对象时,JVM首先会检查这个New指令的参数是否在常量池中定位到一个类的符号引用,然后检查与这个符号引用相对应的类是否已经成功经历过加载、解析和初始化等步骤。当类完成装载步骤之后,就已经完全可以确定出创建对象实例时所需要的内存空间大小,接下来JVM就会对其进行内存分配,以存储所生成的对象实例。
分配内存
基于分代的概念,Java的堆区还可以划分为新生代(YoungGen)和老年代(OldGen),其中新生代又可以划分为Eden空间、From Survivor空间和To Survivor空间。在JVM的运行时,堆区和方法区是线程共享区域,因此在并发环境下从堆区中划分内存空间是非线程安全的,所以要保证数据操作的原子性。基于线程安全的考虑,如果一个类在分配内存之前已经成功完成类装载步骤之后,JVM就会优先选择在TLAB(ThreadLocal Allocation 本地线程分配缓冲区)中为对象实例分配内存空间,TLAB在Java堆区中是一块线程私有区域,它包含在Eden空间内。一旦对象在TLAB中空间分配内存失败,JVM就会尝试通过使用加锁机制来确保数据操作的原子性,从而直接在Eden空间中分配内存,如果当在Eden空间中也无法分配内存时,JVM就会执行Minor GC,直到最终可以在Eden空间中分配内存为止。
初始化对象实例
当为对象成功分配好所需的内存空间后,JVM所做的就是初始化对象实例。JVM首先会对分配后的内存空间进行零值初始化,这一步操作确保了对象的实例字段在Java代码中不用赋初始值就能够直接使用,程序能够访问到这些字段的数据类型所对应的零值。零值初始化之后&#x

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值