在线客服
扫描二维码
下载博学谷APP
扫描二维码
关注博学谷微信公众号
TLAB线程本地分配缓存区是什么?工作原理分析,TLAB全称Thread Local Allocation Buffer,即线程本地分配缓存区,是一个线程专用的内存分配区域。在线程初始化时,虚拟机会为每个线程分配一块TLAB空间,只给当前线程使用。

TLAB是虚拟机在堆内存的eden划分出来的一块专用空间线程专属。在虚拟机的TLAB功能启动的情况下,在线程初始化时,虚拟机会为每个线程分配一块TLAB空间,只给当前线程使用,这样每个线程都单独拥有一个空间,如需要分配内存,在自己的空间上分配,在不存在竞争的情况大大提升分配效率。
上面描述中"线程专属"、"只给当前线程使用"、"每个线程单独拥有"的描述怎么理解呢?因TLAB技术,堆内存并不是完完全全的线程共享,其eden区域中还是有一部分空间是分配给线程独享的。TLAB是线程独享的,但只在“分配”这个动作上是线程独享,在读取、垃圾回收等动作上是线程共享,且在使用上也没有什么区别。

每个线程在初始化时都会去堆内存中申请一块TLAB,并不是说这个TLAB区域的内存其他线程就完全无法访问,其他线程读取也可以,只不过无法在这个区域中分配内存而已。在TLAB分配之后不影响对象的移动和回收。虽然对象刚开始可能通过TLAB分配内存,存放在Eden区,但是还是会被垃圾回收或者被移到Survivor Space、Old Gen等。
TLAB是在eden区分配,eden区域本身就不太大,TLAB空间的内存也非常小,默认情况下仅占有整个Eden空间的1%,存在一些大对象是无法在TLAB直接分配。TLAB中无法分配的大对象,对象还是可能在eden区或者老年代等进行分配的,但这种分配就需要进行同步控制,这也是大家经常说的小的对象比大的对象分配起来更加高效。
如果设置了虚拟机参数 -XX:UseTLAB,在线程初始化时,同时也会申请一块指定大小的内存,只给当前线程使用,这样每个线程都单独拥有一个空间,如果需要分配内存,就在自己的空间上分配就不存在竞争还可以大大提升分配效率。
TLAB空间的内存非常小,缺省情况下仅占有整个Eden空间的1%,也可以通过选项-XX:TLABWasteTargetPercent设置TLAB空间所占用Eden空间的百分比大小。TLAB的本质其实是三个指针管理的区域:start,top 和 end,每个线程都会从Eden分配一块空间,例如说100KB,作为自己的TLAB,其中 start 和 end 是占位用的,标识出 eden 里被这个 TLAB 所管理的区域,卡住eden里的一块空间不让其它线程来这里分配。
— 申请免费试学名额 —
在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!
相关推荐 更多
Java基础 HashMap、HashSet、HashTable的区别是什么?
HashMap、HashSet、HashTable的区别:继承的父类不同、线程安全性不同、是否提供 contains 方法、**key 和 value 是否允许 null 值 、哈希值的计算方法不同、内部实现使用的数组初始化和扩容方式不同。
12720
2019-06-03 16:13:08
Git是什么?新手小白入门教程
本文是专门针对新手小白的入门教程,将用通俗易懂的方式讲解“Git是什么”,主要从版本控制、版本控制系统和仓库几方面来具体阐述。
9089
2019-08-09 15:24:33
程序员常用的JVM 配置参数汇总
JVM可以算是初级程序员进阶高级程序员必须要掌握的核心技能之一。另外,在许多面试过程中,JVM也是检验Java程序员能力水平的试金石。今天我们不谈Java底层实现的原理,而是为大家整理汇总了一些常见的,希望对大家编写代码有所帮助。
6979
2020-03-04 18:08:39
2年Java开发需要具有什么水平?
每个程序员都应该有自己的职业规划,清楚的了解自己在不同的阶段应该掌握什么技能。2年工作经验的Java程序员应该具备的技能是Java程序员们比较关心的内容。掌握得越多能得到的评价拿到的薪水势必也越高。
5674
2021-06-07 16:37:12
Java多线程遇到死锁三招彻底解决
在多线程环境中,多个进程可以竞争有限数量的资源。当一个进程申请资源时,如果这时没有可用资源,那么这个进程进入等待状态。有时,如果所申请的资源被其他等待进程占有,那么该等待进程有可能再也无法改变状态。这种情况称为死锁。
7812
2022-06-22 15:00:01
