什么是TLAB?

这个得从内存申请说起。

一般而言生成对象需要向堆中的新生代申请内存空间,而堆又是全局共享的,像新生代内存又是规整的,是通过一个指针来划分的。

内存是紧凑的,新对象创建指针就右移对象大小size即可,这叫指针加法(bump [up] the pointer)。可想而知如果多个线程都在分配对象,那么这个指针就会成为热点资源,需要互斥那分配的效率就低了。于是搞了个TLAB (Thread Local Allocation Buffer) ,为一个线程分配的内存申请区域。

这个区域只允许这一个线程申请分配对象,允许所有线程访问这块内存区域。

TLAB的思想其实很简单,就是划一块区域给一个线程,这样每个线程只需要在自己的那亩地申请对象内存,不需要争抢热点指针。

当这块内存用完了之后再去申请即可。

这种思想其实很常见,比如分布式发号器,每次不会一个一个号的取,会取一批号,用完之后再去申请一批。

可以看到每个线程有自己的一块内存分配区域,短一点的箭头代表TLAB内部的分配指针。如果这块区域用完了再去申请即可。

不过每次申请的大小不固定,会根据该线程启动到现在的历史信息来调整,比如这个线程一直在分配内存那么TLAB就大一些,如果这个线程基本上不会申请分配内存那 TLAB就小一些。

还有TLAB会浪费空间,我们来看下这个图。

可以看到TLAB内部只剩一格大小,申请的对象需要两格,这时候需要再申请一块TLAB,之前的那一格就浪费了。

在HotSpot 中会生成一个填充对象来填满这一块,因为堆需要线性遍历,遍历的流程是通过对象头得知对象的大小,然后跳过这个大小就能找到下一个对象,所以不能有空洞。

当然也可以通过空闲链表等外部记录方式来实现遍历。

还有TLAB只能分配小对象,大的对象还是需要在共享的eden区分配。

所以总的来说TLAB是为了避免对象分配时的竞争而设计的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值