7 Tlab(个人理解,若有不足,敬请指出)

Java对象在完成正确的堆内存空间分配时采用二种方式:一种是cas失败重试,另一种是Tlab。tlab是线程本地分配内存的英语缩写,从语义可知是一个线程专用的内存分配区域,他也存在堆中,但是也独立于堆中空间。

我们在为一个对象在堆中分配空间时,也有其他线程在为对象在堆内存分配空间,于是就存在空间的竞争,在激烈的竞争场合内存分配的效率比较低下,所以考虑以上的情况出现,我们采用TLAB线程专属空间避免多线程冲突,提高分配效率。TlAB也是占用堆内存的esdn空间的,在启用Tlab情况下(默认开启)虚拟机会为每个线程创建一个分配Tlab空间的。TLAB只是让每个线程有私有的分配指针,但底下存对象的内存空间还是给所有线程访问的,只是其它线程无法在这个区域分配而已。

TLAB空间一般是不会太大,则较大对象肯定无法在此分配,正是TlAB空间的局限性,对象可能很容易将此空间装满。如一个线程,他有100k的TLAB空间,现在已存入对象占用了80k,现在有个30k的对象肯定无法满足对空间的需求,所以它存在二种解决方式:第一种就是放弃当前的TLAB空间,把他还给堆空间,创建新的TLAB。第二种就是让这个30k的对象在堆空间分配,保留TLAB空间,或许后面会有小于等于20k的对象。

为了解决以上的情况,虚拟机维护了一个refill-waste的值,他表示TLAB允许内存浪费的空间。默认是tlab空间的1/64(在运行时可能会自动调整达到最优化)。当新的对象请求时空间内存已不足时,会让当前对象所需占用的空间内存和refill-waste比较,若大于rw会在堆中分配,保留tlab;小于rw会废弃当前Tlab空间新建一个分配对象。当然这些鬼东西都是可以手动调节,具体参数网上找。

其实对象的大致分配流程:

第一:尝试栈上分配,如不成功第二步。

第二:尝试tlab分配,如不成功第三步。

第三:是否满足老年代分配,如不成功第四步。

第四:edsn分配。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值