讲师中心 微信公众号
AI工具推荐 视频效率加速

Java中的TLAB(Thread Local Allocation Buffer)_减少堆分配锁竞争的机制

星强同学_9236

星强同学_9236

发布时间:2026-02-26 12:18:01

|

992人浏览过

|

来源于php中文网

原创

TLAB 是 JVM 在 Eden 区为每个线程私有分配的内存块,用于避免对象分配时竞争全局堆锁;关闭后所有 new 操作需同步访问 Eden,导致线程阻塞、分配变慢、GC 频繁。

java中的tlab(thread local allocation buffer)_减少堆分配锁竞争的机制

TLAB 是什么,为什么不用它会卡在 new 上

TLAB 是 JVM 在 Eden 区为每个线程私有分配的一小块内存,线程新建对象时优先往自己的 TLAB 里写,完全不碰全局堆锁。一旦关闭或大小不合理,所有线程抢 Eden 的指针和锁,new 操作就会频繁进入安全点、触发同步等待——你看到的“小对象创建变慢”“GC 日志里 Allocation Failure 频次异常高”,大概率是 TLAB 没配好。

常见错误现象:Unsafe.allocateInstance 走得快,但普通 new 却卡顿;JFR 或 jstat -gc 显示 EC(Eden Capacity)利用率低,但 EU(Eden Used)涨得慢且不连续;线程 dump 里大量线程阻塞在 SharedHeap::allocate 或类似符号上。

  • 默认开启(HotSpot 8u60+),但大小由 -XX:TLABSize、-XX:TLABWasteTargetPercent 等隐式控制,不能只靠默认
  • 小对象(,具体看 <code>-XX:MaxTLABSize)才进 TLAB;大对象直接走 Eden 公共区,必然竞争
  • TLAB 用满后会尝试 refill,失败则降级到共享 Eden 分配——这个过程可能触发 minor GC,尤其当 Eden 剩余空间不足时

-XX:+UseTLAB 关了会怎样,哪些场景真要关

关掉 -XX:+UseTLAB 后,所有对象分配都走共享 Eden,相当于把线程间并发分配退化成串行排队。对吞吐敏感的服务(如网关、批处理)几乎必掉性能,延迟毛刺明显增多。

真正需要关的场景极少,仅限:调试 TLAB 行为本身,或极少数 GC 调优中想观察“无局部缓冲下的真实分配模式”。生产环境关它,基本等于主动给自己加锁。

立即学习“Java免费学习笔记(深入)”;

Java调试
Java调试

通过 JDWP 实现 Java 远程调试:连接远程 JVM、设置断点、单步执行代码、查看变量值、获取调用栈。适用于需要调试远程 Java 应用、排查运行时状态、追踪代码执行流程的场景。 术语注解 JDWP:Java Debug Wire Protocol,Java 调试有线协议(Java 远程调试底层通信协议) remote JVM:远程 Java 虚拟机 step through code:代码单步调试(步入 / 步过 / 步出调试) inspect variables:变量查看 / 变量检视 stac

下载
  • 某些 JDK 版本(如早期 7u)在 CMS 下关 TLAB 可缓解 promotion failure,但那是历史包袱,现代 G1/ZGC 不适用
  • -XX:-UseTLAB 不影响逃逸分析和栈上分配,但会让原本能进 TLAB 的对象全部挤向 Eden 头部,加剧内存碎片
  • 关了之后,ThreadLocal 对象的创建不会变快——它只是引用容器,实际对象仍走堆分配路径

怎么调 TLABSize 和 TLABWasteTargetPercent

不要硬设 -XX:TLABSize。TLAB 大小是动态的:JVM 根据线程分配速率、Eden 大小、历史 refill 频次自动调整,初始值只是起点。强行固定反而容易导致浪费或过早 refill。

关键参数其实是 -XX:TLABWasteTargetPercent(默认 1%),它控制每次 refill 前允许浪费多少 TLAB 空间。值太小(如 0.1)→ refill 太勤 → 频繁同步;太大(如 5)→ 单个 TLAB 过大 → Eden 利用率下降、易触发提前 GC。

  • 高分配率服务(如实时计算)可适当调高到 2-3,减少 refill 次数
  • 对象大小方差大(既有 byte[] 也有 POJO)时,注意 -XX:MinTLABSize(最小值,默认 2KB)别设得太低,否则小对象也频繁 refill
  • 用 -XX:+PrintTLAB 观察日志,重点关注 waste 字段:若长期 > Target,说明当前策略浪费严重;若 refills 次数远高于线程数,说明 TLAB 太小或分配不均

G1 和 ZGC 下 TLAB 还重要吗

重要,而且机制更精细。G1 的 TLAB 仍绑定 Eden region,但 refill 时会考虑 region 的可用性;ZGC 的 TLAB 实际是 per-thread 的 colored pointer 缓冲区,虽然不涉及传统锁,但仍有“本地缓冲耗尽→申请新 page”的开销。

区别在于:G1/ZGC 下 TLAB refill 不再直接导致 STW,但频繁 refill 仍增加元数据操作和 memory mapping 压力,间接抬高 pause 时间。

  • G1 中,-XX:G1NewSizePercent 影响 Eden 总大小,从而约束 TLAB 上限;盲目增大 Eden 不等于 TLAB 更大,要看线程数和分配节奏
  • ZGC 默认启用 -XX:+UseTLAB,且无法关闭(JDK 17+),它的 TLAB 管理藏在 ZPageAllocator 内部,调优主要靠 -XX:ZCollectionInterval 和堆大小间接影响
  • 无论哪种 GC,TLAB 无法规避大对象(> MaxTLABSize)的共享分配——所以对象池、复用 byte[]、避免临时大数组,比调 TLAB 参数更治本

TLAB 不是开关一开就万事大吉的黑盒,它和你的对象大小分布、线程生命周期、GC 类型深度耦合。最容易被忽略的是:日志里看到 TLAB waste 高,第一反应不该是调参数,而是去查 ObjectSizeInBytes 分布——很多“TLAB 问题”,本质是代码里无意 new 出了一堆 64KB 的 StringBuilder。

热门AI工具

更多
Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

相关专题

更多
C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

379

2026.04.23

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6647

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2748

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6647

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2748

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4658

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

583

2025.12.01

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

20

2026.11.05

DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

20

2026.11.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn