在线客服
扫描二维码
下载博学谷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里的一块空间不让其它线程来这里分配。
— 申请免费试学名额 —
在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!
相关推荐 更多
String s = "Hello";s = s + " world!"码执行变化
String s = "Hello";s = s + " world!";这两行代码执行后原始的 String 对象中的内容变了吗? 没有。因为 String 被设计成不可变(immutable)类,所以它所有对象都是不可变对象。在这段代码中,s 原先指向一个 String 对象,内容是 "Hello",然后我们对 s 进行了+操作。
9904
2019-05-24 16:23:20
2019年12月Github上优秀的Java开源项目盘点
无论是作为已经有一定开发经验的Java程序员还是正在学习Java语言的同学,做开源项目都是大家学习和提升编程能力的最佳途径。在程序员不断攀登技术这座大山的时候,需要不断练习和磨练自己的技能,而优秀的开源项目就是帮助我们攀登的利器。本文为大家盘点了2019年12月份GitHub上优秀的Java开源项目,下面我们一起来看看吧!
8489
2020-01-14 19:42:17
Java面试之数据库知识点复习
数据库一直都是Java面试中的重点考察项目,本文为大家整理出来了常见的数据库知识点,内容主要有select语句完整的执行顺序、SQL之聚合函数、SQL之连接查询、SQL之sql注入、Mysql性能优化、MySQL 中文乱码问题完美解决方案。
6383
2020-05-04 14:24:56
线程池经典面试题整理附答案
线程池是一种多线程处理形式,它是Java开发面试中的必考知识点,尤其是在一些大厂的求职面试中,线程池是对求职者考核的重点。为了帮助大家可以更好地通过面试,本文特地为大家整理了线程池经典面试题并附上了答案,下面一起来尝试着做一做吧!
9340
2020-06-17 14:44:17
微服务和分布式的区别什么?有什么特点?
微服务设计是为了不因为某个模块的升级和BUG影响现有的系统业务。微服务与分布式的细微差别是,微服务的应用不一定是分散在多个服务器上也可以是同一个服务器。分布式属于微服务,将模块拆分成一个独立的服务单元通过接口来实现数据的交互。分布式和微服的架构很相似,只是部署的方式不一样而已。
5047
2021-03-10 11:10:50
