概念

为了避免一系列的非线程安全问题,同时还能提升内存分配的吞吐量,它是在eden空间进行分配的,每个线程都有一个缓冲区域,空间只有Eden的1%,可以通过-XX:UseTLAB来配置是否开启tlab(默认是开启的),通过-XX:TLABWasteTargetPercent来设置TLAB空间所占用Eden空间的百分比大小。

为什么需要tlab

在jvm中堆区是共享的区域,一旦在并发环境下从堆中划分内存空间,就可能会遇到分配到同一个内存地址的问题,为了避免多个线程操作同一个地址,就需要使用加锁等机制,但这会影响分配速度,因此使用tlab可以避免在多线程分配内存时的非线程安全问题,同时还能提升内存分配的吞吐量。

尽管不是所有的对象实例都能在tlab中成功分配,但jvm确实是将tlab作为内存分配的首选项,一旦分配失败,jvm就会尝试着通过使用加锁机制确保数据操作的原子性,从而直接在Eden空间中分配内存。
eden空间中tlab占的位置示例图:

tlab对象的分配过程:

优先分配到tlab空间中,如果成功则继续对象的初始化,如果失败,则由eden分配到非tlab区域。

代码实例:
通过配置tlab开启与否,来验证开启tlab是否会影响对象分配的效率。

package com.lydon.test;
import java.util.ArrayList;public class TlabTest {public static void main(String[] args) {long startTime = System.currentTimeMillis();for (int i = 0; i<100000000;i++){ArrayList<String> list = new ArrayList();list.add(""+i);}long endTime = System.currentTimeMillis();System.out.println(endTime - startTime);}
}

当jvm参数为:-XX:+UseTLAB -XX:-DoEscapeAnalysis -server时

当jvm参数为:-XX:-UseTLAB -XX:-DoEscapeAnalysis -server时

可以看到耗时差异有将近3秒之多。

常见问题与答案

1、tlab跟java程序的多线程控制什么关系,java程序在多线程环境下不控制线程安全也可以最终线程安全吗?
答:跟java代码中的多线程安全无关系,这里只是指多线程下在堆空间中对对象的内存分配安全问题。

2、为什么多线程环境下分配内存会出现线程安全问题?
Java 程序会极其频繁的创建对象并为对象分配内存空间,一般情况下对象是分配在堆上的,堆又是全局共享的,所以会存在多个线程同时在堆上申请空间,而堆要同步处理,导致性能下降,而且同时为多个线程分配内存又可能会存在多个线程抢占一个内存地址的问题。
那么为了解决这一问题,Java 虚拟机提供了 TLAB 分配。TLAB 全称是 Thread Local Allocation Buffer,线程本地分配缓存,是一个线程私有的内存分配区域。虚拟机在 eden 区为每一个线程分配一块线程专用的内存区域 TLAB 区域。这样多个线程同时在堆上申请空间时,可以直接在当前线程自己的 TLAB 区域分配对象,不必等待堆同步处理,提高了效率。

3、什么时候tlab分配成功,什么时候分配失败?
由于tlab总空间只有eden空间大小的1%,因此当需要分配的对象内存大小太大,不足以放进tlab时,就会出现分配失败的情况下,就会由分配到非tlab的eden空间中,如果eden空间也不够大(此时幸存者区一般也不够),就会直接到老年代区去。

线程本地分配缓存TLAB相关推荐

  1. 在TLAB(线程本地分配缓存)上分配对象

    目录 使用TLAB性能差异 示例 分配策略 Java对象分配过程 JVM的Thread Local Allocation Buffer,即TLAB线程本地分配缓存,作用是加速分配对象空间,以前的日志里 ...

  2. JVM线程本地分配缓冲区(Thread Local Allocation Buffer)TLAB详解

    最近在看java性能相关方面的书籍.然后在GC调优相关的部分出现了,线程本地分配缓冲区的名词,对于它的调优级为重要,所以就梳理一下这个到底是什么?为什么他对于JVM性能如此重要. 什么是JVM线程本地 ...

  3. 本地线程分配缓冲_线程本地分配缓冲区

    本地线程分配缓冲 最近,我一直在研究遭受严重性能问题的Java应用程序. 在许多问题中,真正引起我注意的一个问题是新对象的分配速度相对较慢(应用程序分配了大量的相当大的对象). 后来发现,原因是大量的 ...

  4. JVM调优:栈上分配和线程本地分配TLAB

  5. JVM 栈分配与TLAB

    我们在学习使用Java的过程中,一般认为new出来的对象都是被分配在堆上,但是这个结论不是那么的绝对,通过对Java对象分配的过程分析,可以知道有两个地方会导致Java中new出来的对象并一定分别在所 ...

  6. JVM 的栈上分配、TLAB、PLAB 有啥区别?

    我们在学习 G1 回收器的时候,一般我们都会接触到 TLAB 和 PLAB 这两个术语.它们都是为了提高内存分配效率而存在的,但它们和栈上分配有什么区别呢?今天,就让树哥带着大家盘一盘. 栈上分配 稍 ...

  7. 关于栈上分配和TLAB的理解

    引言 我们知道,一般在java程序中,new的对象是分配在堆空间中的,但是实际的情况是,大部分的new对象会进入堆空间中,而并非是全部的对象,还有另外两个地方可以存储new的对象,我们称之为栈上分配以 ...

  8. 栈上分配和TLAB的区别

    栈上分配 JVM中,栈上空间为线程私有,堆上空间为全局共享.所以大部分对象存在于堆上,线程通过栈上的引用指向堆上对象的内存地址.堆上没有任何引用关系的对象会被JVM标记后GC掉. 很多对象不存在逃逸现 ...

  9. 通过transmittable-thread-local源码理解线程池线程本地变量传递的原理

    前提 最近一两个月花了很大的功夫做UCloud服务和中间件迁移到阿里云的工作,没什么空闲时间撸文.想起很早之前写过ThreadLocal的源码分析相关文章,里面提到了ThreadLocal存在一个不能 ...

最新文章

  1. 数据预处理--噪声_为什么数据对您的业务很重要-以及如何处理数据
  2. Oracle EBS R12 客户表结构
  3. 2007上半年網絡工程師考題
  4. 【nuxtjs 指南】解决nuxtjs本地开发跨域和防止路由与api冲突问题
  5. jzoj3896-战争游戏【tarjan,割点,点双联通分量】
  6. LeetCode 1844. 将所有数字用字符替换
  7. vue中路径的配置使用
  8. Linux系统:Centos7搭建Redis单台和集群环境
  9. Linux软件安装及基本概念
  10. 九种跨域方式的实现原理,第一个就超惊艳!| 技术头条
  11. JNDI RMI 注入(Log4j2漏洞)
  12. 使用监控宝监控php-fpm状态
  13. xrd连续扫描和步进扫描_材料分析测试技术实验报告
  14. 对于注塑模具设计的原则,这些核心你掌握了吗?
  15. GPIO output level 和 GPIO Pull-up/Pull-down的区别
  16. 【初级C语言】代码版式(空行,空格,对齐,长行代码,注释)
  17. 五福题材的公众号图文排版有哪些素材?
  18. 【二叉树的遍历-3】后序遍历(递归与非递归)
  19. springboot读取bootstrap配置及knife4j版本兼容性问题
  20. 新网站需要多少时间才有收录量?

热门文章

  1. ensp配置USG6000V界面登录
  2. MySQL “Zero date value prohibited“ 问题
  3. qt 复制字符串_Qt字符串处理 QString用法总结(二)
  4. shell if 对字符串的判断
  5. 如何做好一名运维工程师
  6. 人大计算机应用同等学力申硕,人民大学同等学力申硕
  7. MySql插入一条数据不提交事务主键还是会自增1
  8. soulworker日服显示无服务器,混沌与秩序Online - 魔幻3D MMORPG手游玩得时候总是白屏什么原因...
  9. xp系统更改计算机名BIOS设置,xp怎么进入bios,教您电脑怎么进入bios
  10. 黑马程序员--7K面试题--交通灯管理系统