基于本文回答
0
评论

什么是 TLAB(Thread Local Allocation Buffer)

知识点图片

TLAB (Thread Local Allocation Buffer),中文全称是线程本地分配缓存区。它是 Java 虚拟机(JVM)中用于优化对象分配性能的一种重要技术。

简单来说,TLAB 是 JVM 在堆内存(具体是新生代的 Eden 区)中为每个线程预先分配的一小块私有内存区域

为了让你更清晰地理解,我们可以从以下几个方面来详细拆解 TLAB:


1. 为什么需要 TLAB?(解决什么问题)

在 Java 中,几乎所有的对象都分配在堆内存(Heap)中。而堆内存是所有线程共享的。

  • 没有 TLAB 时的痛点:当多个线程同时要在堆上创建对象时,为了防止两个线程把对象分配到同一个内存地址,JVM 必须对分配内存的操作进行加锁同步(通常使用 CAS 操作)。由于 Java 程序中创建对象是非常频繁的操作,频繁的锁竞争会严重影响程序的执行效率。
  • 有了 TLAB 之后的解决方式:JVM 为每个线程单独分配一块专属的内存区域(TLAB)。线程需要分配对象时,直接在自己的 TLAB 中进行。因为这块内存是线程私有的,所以不需要加锁,只需要移动一个指针(称为“指针碰撞”),从而大大提高了对象分配的效率。

2. TLAB 的核心特性

  • 位置:TLAB 位于堆内存的新生代 Eden 区
  • 分配是私有的,读取是共享的:这是非常重要的一点。TLAB 仅仅在分配对象时是线程独享的(为了避免冲突),但一旦对象分配完成,这个对象对于其他线程是可见的,其他线程依然可以读取甚至修改这个对象的数据。
  • 容量较小:TLAB 的空间通常很小,默认情况下仅占整个 Eden 区的 1% 左右(可以通过 JVM 参数调整)。
  • 适合小对象:TLAB 主要是为了高频的小对象分配而设计的。如果遇到大对象,TLAB 放不下,JVM 依然会绕过 TLAB,直接去共享的 Eden 区甚至老年代分配。

3. TLAB 的对象分配流程

当我们在 Java 代码中执行 new Object() 时,JVM 分配内存的流程大致如下:

  1. 尝试 TLAB 分配:检查当前线程的 TLAB 剩余空间是否足够存放新对象。
  2. 空间足够:直接在 TLAB 中通过“指针碰撞”分配内存,不需要加锁,分配极快。
  3. 空间不足:如果 TLAB 剩余空间不够了,JVM 会面临两个选择:
    • 直接分配到共享 Eden 区:如果新对象本身比较大,超过了当前 TLAB 的剩余空间,且剩余空间还算比较多(没有达到浪费阈值),那么这个大对象会直接在 Eden 区通过 CAS 加锁分配。
    • 申请新的 TLAB:如果当前 TLAB 剩余空间非常小了(达到了浪费阈值,即被视为“废弃”),JVM 会放弃当前的 TLAB,重新向 Eden 区申请一块新的 TLAB,然后再在新的 TLAB 中分配该对象。(注意:申请新 TLAB 的这个动作是在共享区进行的,需要加锁)。

4. TLAB 的优缺点

优点:

  • 极高的分配效率:实现了无锁分配(Lock-Free),避免了多线程冲突。
  • 提升缓存命中率:由于同一个线程分配的对象在内存上是连续的,这符合 CPU 缓存的空间局部性原理,有助于提升 CPU Cache 的命中率。

缺点:

  • 内存碎片(空间浪费):因为 TLAB 是一块固定大小的内存,当 TLAB 剩下一点点空间,但又放不下下一个对象时,这点空间就会被浪费掉(称为内部碎片),直到下一次垃圾回收(GC)。
  • 不适合大对象:大对象的分配依然会退化为共享区的同步分配。

5. 相关的 JVM 参数

在日常开发或性能调优中,我们可以通过以下参数控制 TLAB:

  • -XX:+UseTLAB:开启 TLAB(JDK 8 及以后版本默认开启)。
  • -XX:-UseTLAB:关闭 TLAB。
  • -XX:TLABSize:手动指定 TLAB 的初始大小。
  • -XX:TLABWasteTargetPercent:设置 TLAB 空间所占 Eden 区的百分比,默认是 1%。
  • -XX:+PrintTLAB:打印 TLAB 的使用情况(用于调优分析)。

总结打个比方

假设堆内存(Eden区)是一个大型公共储物仓库

  • 没有 TLAB:所有的工人(线程)都跑到公共仓库去找空位放货物(对象)。为了防止两个人看中同一个空位,必须有一个管理员在门口登记排队(加锁),效率很低。
  • 有 TLAB:管理员给每个工人划分了一个个人的小推车(TLAB)。工人们平时就在自己的小推车里放货物,不用排队,速度飞快。只有当小推车装满了,或者来了一件超大的货物小推车装不下时,工人才会去找管理员重新申请新推车,或者直接把大货物放到公共仓库去。
右滑查看面试常问