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

如何分析 JVM 的 TLAB 在多核 CPU 竞争下的碎片化损耗与 Refill 策略优化

浅明大大_6722

浅明大大_6722

发布时间:2026-04-29 10:29:33

|

573人浏览过

|

来源于php中文网

原创

TLAB refill失败时,JVM尝试为线程重新分配新TLAB但Eden空间不足,触发Young GC;失败后线程降级至共享Eden分配,导致内存不连续、填充对象堆积和碎片化损耗。

如何分析 jvm 的 tlab 在多核 cpu 竞争下的碎片化损耗与 refill 策略优化

TLAB refill 失败时到底发生了什么

当线程的 TLAB 空间不足,且剩余空间又不足以容纳当前对象(哪怕只差几个字节),JVM 就会触发 refill:尝试为该线程申请一块新的 TLAB。但这个过程不是原子的——它要先锁住 Eden 区的分配指针,CAS 更新,再划出新缓冲区。在高并发、多核密集写场景下,多个线程几乎同时 refill,就会在 Eden 分配指针上形成 CAS 冲突队列,出现“refill 拥塞”。此时部分线程被迫降级走慢路径,直接在共享 Eden 区分配,引发局部内存不连续、填充对象(Filler Object)堆积,也就是你看到的“碎片化损耗”。

  • 典型现象:PrintTLAB 日志中某线程 refills 次数突增,同时 waste 字段飙升(比如从 0.5% 跳到 12%)
  • 根本原因不是 TLAB 太小,而是 refill 频率与线程分配节奏错配:线程每秒分配 300KB,但 TLAB 设成 128KB,导致每秒 refill 2~3 次,每次浪费几十 KB
  • 不要只看平均分配量;重点抓 P95/P99 单次请求的对象体积分布——大促流量里常有突发的 400KB 临时 buffer,它会让一个本该撑 5 秒的 TLAB 在 0.8 秒内报废

用 -XX:+PrintTLAB 定位真实浪费源头

-XX:+PrintTLAB 输出不是统计摘要,而是每秒一条线程级明细,必须配合真实流量跑够 3~5 分钟才能看出模式。关键字段就三个:refills(本秒 refill 次数)、waste(本秒浪费字节数 / 本秒总分配字节数 × 100%)、fast_alloc(本秒成功 TLAB 分配次数)。如果某线程 waste > 5% 且 refills > 1,基本可判定其 TLAB 过小或分配不均。

  • 别信“平均 waste 1.2%”——可能 90% 线程 waste 是 0.3%,剩下 10% 线程拉高均值到 1.2%,而这 10% 才是 GC 波动源
  • 对比 jstat -gc <pid></pid> 的 EC(Eden 容量)和 EU(Eden 已用),若 EU 长期在 EC 的 70%~90% 波动,但 PrintTLAB 显示大量 refill,说明碎片已开始侵蚀有效分配空间
  • 开启 -XX:+PrintGCDetails 后,留意日志里是否频繁出现 humongous allocation ——这代表你试图 new 的对象(如 new byte[1024*1024])被判定为大对象,绕过 TLAB 直接冲击 Eden 头部,加剧竞争

TLABSize 和 ResizeTLAB 的实际取舍逻辑

硬设 -XX:TLABSize=512k 只在两种情况成立:线程分配速率极其稳定(如固定 batch size 的 IO worker),或大促压测阶段需消除 resize 开销。其余场景,默认开启 -XX:+ResizeTLAB(JDK8+ 默认 true)更安全——JVM 会基于最近几次 GC 周期内各线程的实际分配总量,动态调整下一轮的 TLAB 初始大小。

  • 自适应生效前提:必须让 JVM 经历至少 2 次 Young GC,它才开始积累线程分配画像;压测时间太短(
  • 控制浪费上限:加 -XX:TLABWasteTargetPercent=1,JVM 会把 refill 触发阈值压得更紧,宁可多 refill 一次,也不让单次浪费超 1%
  • 注意 MinTLABSize:默认 2048 字节,但某些轻量线程(如心跳检测线程)每秒只分配几百字节,JVM 不会把它 TLAB 缩到低于此值,造成隐性浪费——此时应考虑用线程池隔离这类低频线程

大对象与 TLAB 碎片的隐蔽耦合

所谓“大对象绕过 TLAB”,真实逻辑是:只要对象大小 > 当前 TLAB 剩余空间的一半,就拒绝进入。这意味着一个刚 refill 出来、还剩 400KB 的 TLAB,遇到一个 201KB 对象就会直接拒收,转而走共享 Eden 分配。这种“半途拒收”比 TLAB 耗尽更伤——它留下 199KB 碎片无法复用,又不触发 refill,等于白占内存。

  • 监控建议:用 Async-Profiler 的 alloc 模式采样堆分配热点,重点关注 top 3 大对象的 class 和 size,而不是盲目调大 TLAB
  • 避免“拆分陷阱”:把 new byte[1024*1024] 改成 10 个 new byte[1024*102] ,看似进了 TLAB,实则引发 10 次 refill + 10 个 Filler Object,碎片总量反而上升
  • 真正解法是分级:对确定的大 buffer,改用 ByteBuffer.allocateDirect() 或池化;对不确定的,用 -XX:TLABMaxRefillWasteFraction=0.5 收紧判断逻辑(但需验证是否增加 refill 频率)
TLAB 碎片从来不是孤立问题,它总是和线程行为、对象尺寸分布、GC 周期长度咬合在一起。最危险的信号,是 refill 次数稳定但 waste 持续爬升——说明你的线程正在缓慢地、不可逆地把 Eden 区割成越来越细的格子。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
Lovart
Lovart Hot

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

WorkBuddy

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

豆包大模型

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

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

DeepSeek

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

PixPix
PixPix Hot

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

讯飞智作

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

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

11917

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

9002

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

7712

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1264

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1008

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

1516

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

3109

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

20371

2023.08.03

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

0

2026.11.03

热门下载

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

精品课程

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

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