tlab能避免锁竞争,因其为每个线程在eden区划分私有缓冲区,对象分配仅需指针移动(bump-the-pointer),无需同步;仅当tlab耗尽、对象过大或eden满时才退回到需cas的共享区分配。

TLAB 是 JVM 在堆内存 Eden 区中为每个线程单独划分的一小块私有缓冲区,核心目标是让对象分配“免锁、快速、线性”,从根本上规避多线程争抢共享堆内存带来的性能瓶颈。
TLAB 为什么能避免锁竞争
普通堆内存是所有线程共享的,若直接在 Eden 区分配对象,多个线程同时申请内存必须同步(比如用 CAS 或全局锁),开销大。TLAB 把 Eden 切成一个个“线程专属小隔间”——每个线程只操作自己的那一块,彼此互不干扰。只要对象能放进当前 TLAB,分配就只是移动一个指针(bump-the-pointer),完全无锁。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
TLAB 的分配与扩容机制
- JVM 启动后,为每个新线程在 Eden 区预分配一块初始 TLAB(默认约占 Eden 总空间的 1%,可通过 -XX:TLABWasteTargetPercent 调整)
- 线程分配对象时,优先检查自身 TLAB 剩余空间是否足够;够,直接 bump 指针完成分配
- 不够时,JVM 尝试为该线程重新分配一块更大的 TLAB(仍从 Eden 中划出)
- 若 Eden 空间紧张无法再分配新 TLAB,则退回到共享 Eden 区,用 CAS 原子操作分配——此时才真正出现竞争
TLAB 大小不是固定不变的
它会根据线程实际分配行为动态调整:频繁触发 TLAB 耗尽的线程,下次分配时 JVM 会增大其 TLAB;长期用不满的线程,后续 TLAB 可能被缩小。这种自适应策略由 JVM 内部统计逻辑驱动,无需人工干预。也可通过 -XX:TLABSize 强制指定初始大小,但通常不建议硬编码。
TLAB 不是万能的,也有边界情况
- 大对象(如大数组)通常直接绕过 TLAB,在 Eden 共享区分配(避免浪费大量 TLAB 空间)
- 逃逸分析判定可栈上分配的对象,根本不会进入堆或 TLAB
- 某些 GC 算法(如 G1)对超大对象(humongous)会直接分配到老年代,也不走 TLAB
- TLAB 本身存在内部碎片(最后剩余空间太小放不下新对象),JVM 会控制其浪费比例(默认 ≤ 1%),超出则触发重填
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










