0

0

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

P粉602998670

P粉602998670

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

|

972人浏览过

|

来源于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免费学习笔记(深入)”;

WOMBO
WOMBO

使用AI创作美丽的艺术品

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

怎么调 TLABSizeTLABWasteTargetPercent

不要硬设 -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工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
堆和栈的区别
堆和栈的区别

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

425

2023.07.18

堆和栈区别
堆和栈区别

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

598

2023.08.10

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

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

425

2023.07.18

堆和栈区别
堆和栈区别

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

598

2023.08.10

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

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

721

2023.08.10

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

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

95

2025.12.01

batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

331

2026.02.25

Steam官网正版入口与注册登录指南_新手快速进入游戏平台方法
Steam官网正版入口与注册登录指南_新手快速进入游戏平台方法

本专题系统整理Steam官网最新可用入口,涵盖网页版登录地址、新用户注册流程、账号登录方法及官方游戏商店访问说明,帮助新手玩家快速进入Steam平台,完成注册登录并管理个人游戏库。

49

2026.02.25

TypeScript全栈项目架构与接口规范设计
TypeScript全栈项目架构与接口规范设计

本专题面向全栈开发者,系统讲解基于 TypeScript 构建前后端统一技术栈的工程化实践。内容涵盖项目分层设计、接口协议规范、类型共享机制、错误码体系设计、接口自动化生成与文档维护方案。通过完整项目示例,帮助开发者构建结构清晰、类型安全、易维护的现代全栈应用架构。

33

2026.02.25

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.9万人学习

C# 教程
C# 教程

共94课时 | 10.2万人学习

Java 教程
Java 教程

共578课时 | 72.7万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号