Java对象的分配原则

很多人都知道Java运行时区域分为5大块(VM stack、heap、method area、native method stack、program counter register),其中 heap(堆空间) 为对象的存储空间。那是否所有对象都存于堆中呢?大家是否知道Java中对象的分配原则呢?

其实Java中的对象并不是全部分配在堆内存区域,也可能分配在栈中。一个对象创建后的分配顺序如下:

1.尝试进行栈上分配(线程私有小对象,对象无逃逸,并且支持标量替换),栈上分配的对象会随着方法结束栈帧弹出而消亡,无需等到GC去清理;

2.栈上分配失败,如果是大对象,则直接分配到堆中Old区;

3.如果是小对象,优先进行线程私有本地分配(Thread Local Allocation Buff(TLAB),文末解释);

4.线程私有本地分配失败,则分配在堆中Young区中的Eden区。

涉及点:

Thread Local Allocation Buff,简称 TLAB,线程私有本地分配。在Eden区中,由于空间是线程共享,会导致多个线程同时去竞争Eden区中位置而降低效率。为了减少这种情况,每个线程会在Eden区中获取一块私有空间(默认1%,JVM参数可调),线程上的私有小对象会优先分配到这里,避免多个线程同时竞争一个位置,提高效率。TLAB也是位于Eden区中。

最后总结以上的对象分配原则可以画出一张图:

 图片来自于:https://www.processon.com/view/link/623806e75653bb071e724e6b

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值