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的本质

其实是三个指针管理的区域:starttopend,每个线程都会从Eden分配一块空间,例如说100KB,作为自己的TLAB,其中 start 和 end 是占位用的,标识出 eden 里被这个 TLAB 所管理的区域,卡住eden里的一块空间不让其它线程来这里分配。

在这里插入图片描述

TLAB只是让每个线程有私有的分配指针,但底下存对象的内存空间还是给所有线程访问的,只是其它线程无法在这个区域分配而已。 从这一点看,它被翻译为 线程私有分配区更为合理一点
当一个TLAB用满(分配指针top撞上分配极限end了),就新申请一个TLAB,而在老TLAB里的对象还留在原地什么都不用管——它们无法感知自己是否是曾经从TLAB分配出来的,而只关心自己是在eden里分配的。但是如果分配一次以后内存还是不够的话, 则直接移入Eden区

3.TLAB的缺点 :

  1. TLAB通常很小,所以放不下大对象。

    1. TLAB空间大小是固定的,但是这时候一个大对象,我TLAB剩余的空间已经容不下它了。(比如100kb的TLAB,来了个110KB的对象)
    2. TLAB空间还剩一点点没有用到,有点舍不得。(比如100kb的TLAB,装了80KB,又来了个30KB的对象)
      所以JVM开发人员做了以下处理,设置了最大浪费空间。
      • 当剩余的空间小于最大浪费空间,那该TLAB属于的线程在重新向Eden区申请一个TLAB空间。进行对象创建,还是空间不够,那你这个对象太大了,去Eden区直接创建吧!
      • 当剩余的空间大于最大浪费空间,那这个大对象请你直接去Eden区创建,我TLAB放不下没有使用完的空间。
  2. Eden空间够的时候,再次申请TLAB没问题 ; 但是如果不够,Heap的Eden区要开始GC

  3. TLAB允许浪费空间,导致Eden区空间不连续,积少成多。以后还要人帮忙打理

4. 扩展

4.1 创建对象的内存分配

img

  1. 编译器通过逃逸分析判断对象是在栈上分配还是堆上分配,如果是堆上分配则进入下一步。(开启逃逸分析需要设置jvm参数)
  2. 如果tlab可以放下该对象则在tlab上分配,否则进入下一步。
  3. 重新申请一个tlab,再尝试存放该对象,如果放不下则进入下一步。
  4. 在eden区加锁,尝试在eden区存放,若存放不下则进入下一步。
  5. 执行一次Young GC。
  6. Young GC后若eden区仍放不下该对象,则直接在老年代分配。

转载地址:https://blog.csdn.net/weixin_40597409/article/details/115260241 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:JVM原理 | 永久代和元空间区别
下一篇:多线程 & 线程经典案例 &锁 详细笔记

发表评论

最新留言

做的很好,不错不错
[***.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中String、StringBuilder与StringBuffer的区别? 2019-04-26
【面试篇】Java对象的hashCode()相同,equals()一定为true吗? 2019-04-26
【面试篇】Java中static和final关键字的作用是什么? 2019-04-26
【面试篇】Java中接口和抽象类的区别是什么? 2019-04-26
【Java网络编程与IO流】Java中IO流分为几种?字符流、字节流、缓冲流、输入流、输出流、节点流、处理流 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
【Java网络编程与IO流】SpringBoot + WebSocket + Netty实现实时的服务器消息推送 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