JVM原理 | TLAB是什么
发布日期:2022-02-21 17:40:19
浏览次数:55
分类:技术文章
本文共 1326 字,大约阅读时间需要 4 分钟。
TLAB (Thread Local Allocation Buffer)
1.概述
TLAB ( Thread local Allocation Buffer ) 本地线程分配缓存 , 这是一个线程专用的内存分配区域, 可以解决内存分配冲突的问题;
虚拟机参数 -XX:UseTLAB
在线程初始化时,同时也会申请一块指定大小的内存,只给当前线程使用,这样每个线程都单独拥有一个空间,如果需要分配内存,就在自己的空间上分配,这样就不存在竞争的情况,可以大大提升分配效率
TLAB空间的内存非常小,缺省情况下仅占有整个Eden空间的1%,也可以通过选项-XX:TLABWasteTargetPercent
设置TLAB空间所占用Eden空间的百分比大小
2. TLAB的本质
其实是三个指针管理的区域:start
,top
和 end
,每个线程都会从Eden分配一块空间,例如说100KB,作为自己的TLAB,其中 start 和 end 是占位用的,标识出 eden 里被这个 TLAB 所管理的区域,卡住eden里的一块空间不让其它线程来这里分配。
线程私有分配区
更为合理一点 当一个TLAB用满(分配指针top撞上分配极限end了),就新申请一个TLAB,而在老TLAB里的对象还留在原地什么都不用管——它们无法感知自己是否是曾经从TLAB分配出来的,而只关心自己是在eden里分配的。但是如果分配一次以后内存还是不够的话, 则直接移入Eden区
3.TLAB的缺点 :
-
TLAB通常很小,所以放不下大对象。
- TLAB空间大小是固定的,但是这时候一个大对象,我TLAB剩余的空间已经容不下它了。(比如100kb的TLAB,来了个110KB的对象)
- TLAB空间还剩一点点没有用到,有点舍不得。(比如100kb的TLAB,装了80KB,又来了个30KB的对象) 所以JVM开发人员做了以下处理,设置了最大浪费空间。
- 当剩余的空间小于最大浪费空间,那该TLAB属于的线程在重新向Eden区申请一个TLAB空间。进行对象创建,还是空间不够,那你这个对象太大了,去Eden区直接创建吧!
- 当剩余的空间大于最大浪费空间,那这个大对象请你直接去Eden区创建,我TLAB放不下没有使用完的空间。
-
Eden空间够的时候,再次申请TLAB没问题 ; 但是如果不够,Heap的Eden区要开始GC
-
TLAB允许浪费空间,导致Eden区空间不连续,积少成多。以后还要人帮忙打理
4. 扩展
4.1 创建对象的内存分配
- 编译器通过逃逸分析判断对象是在栈上分配还是堆上分配,如果是堆上分配则进入下一步。(开启逃逸分析需要设置jvm参数)
- 如果tlab可以放下该对象则在tlab上分配,否则进入下一步。
- 重新申请一个tlab,再尝试存放该对象,如果放不下则进入下一步。
- 在eden区加锁,尝试在eden区存放,若存放不下则进入下一步。
- 执行一次Young GC。
- Young GC后若eden区仍放不下该对象,则直接在老年代分配。
转载地址:https://blog.csdn.net/weixin_40597409/article/details/115260241 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2024年04月16日 00时12分22秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【Leetcode刷题篇】leetcode98 判断一棵树是否为二叉搜索树
2019-04-26
Java中arraylist和数组的相互转换
2019-04-26
【Leetcode刷题篇 】leetcode147 对链表进行插入排序
2019-04-26
【Leetcode刷题篇】leetcode148 排序链表
2019-04-26
【面试篇】Java对象的hashCode()相同,equals()一定为true吗?
2019-04-26
【面试篇】Java中static和final关键字的作用是什么?
2019-04-26
【面试篇】Java中接口和抽象类的区别是什么?
2019-04-26
【Java网络编程与IO流】Java中BIO、NIO、AIO的区别是什么?
2019-04-26
【Leetcode刷题篇】leetcode136 只出现一次的数字
2019-04-26
spring boot整合thymeleaf,支持JSP和HTML页面开发
2019-04-26
【Java网络编程与IO流】Spring boot整合SSE实现服务器实时推送流信息
2019-04-26
【Leetcode刷题篇】leetcode141 环形链表II
2019-04-26
【Leetcode刷题篇】leetcode160 相交链表
2019-04-26
【Leetcode刷题篇】leetcode169 多数元素
2019-04-26
【Leetcode刷题篇】leetcode461 汉明距离
2019-04-26
【Leetcode刷题篇】leetcode204 计数质数
2019-04-26
【Leetcode刷题篇】leetcode70 爬楼梯
2019-04-26