TLAB通过为每个线程分配专属Eden内存块,将对象分配从同步操作变为无锁指针移动,避免CAS竞争;加速小对象分配,支持bump-pointer、refill及大对象绕过机制;配合零初始化与动态调优(如ResizeTLAB、WasteTargetPercent),提升吞吐量并适配业务特征。

TLAB(Thread Local Allocation Buffer)通过让每个线程拥有自己专属的Eden区内存小块,彻底避开多线程争抢同一内存指针的问题,从而把对象分配从“需要同步”变成“纯指针移动”,这是它提升效率的核心。
避免全局锁竞争
没有TLAB时,所有线程都要更新Eden区同一个分配指针(eden_top),必须靠CAS操作保证原子性。高并发下大量线程反复尝试CAS失败重试,形成明显瓶颈。启用TLAB后,线程只操作自己TLAB里的本地指针(top),分配动作简化为ptr += object_size,全程无锁、无同步开销。
加速小对象分配路径
绝大多数业务对象(如String、Integer、ArrayList内部数组等)体积小、生命周期短,天然适配TLAB:
- 对象大小 ≤ 当前TLAB剩余空间 → 直接 bump-pointer 分配,毫秒级完成
- 对象大小 > TLAB剩余空间的一半 → 触发refill,申请新TLAB(仅一次CAS)
- 对象过大(如大数组、类元数据)→ 绕过TLAB,直接在Eden共享区分配(走慢路径)
这意味着高频的小对象分配几乎不触碰全局资源,吞吐量显著上升。
立即学习“Java免费学习笔记(深入)”;
配合零初始化提前完成
TLAB在被线程首次获取时,JVM会一次性将整块区域清零。后续在该TLAB内分配的所有对象,跳过逐个字段置零的步骤,省去重复初始化开销。这对频繁创建轻量对象的场景(如JSON解析、流式处理)效果明显。
动态适配与合理调优
TLAB不是设完就一劳永逸,它的实际收益取决于参数是否贴合业务特征:
- -XX:+ResizeTLAB保持开启:JVM根据线程实际分配速率自动调整TLAB大小,应对流量波动更稳
- -XX:TLABWasteTargetPercent=1(默认值):控制TLAB废弃率上限,过高浪费Eden空间,过低导致refill太频繁
- 观察-XX:+PrintTLAB日志:重点关注waste ratio和refill次数,若waste持续>5%或refill频次异常高,说明当前策略与对象分布不匹配


















