您的位置:首页 > 科技 > IT业 > 什么是TLAB?

什么是TLAB?

2024/10/6 8:25:17 来源:https://blog.csdn.net/qq_51967234/article/details/139379986  浏览:    关键词:什么是TLAB?

这个得从内存申请说起。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com