怎么深度理解 TLAB 内部的“浪费上限(Refill Waste Limit)”机制如何平衡空间碎片与重新分配

落静吖_2792

落静吖_2792

2026-05-26

678人浏览

原创

refill_waste_limit是jvm动态计算的碎片容忍阈值,非固定值,初始≈tlab大小/64,后依线程分配节奏浮动;其作用是在不触发refill前提下主动放弃小块剩余空间,避免cas竞争,本质是碎片容忍与延迟的实时权衡。

怎么深度理解 tlab 内部的“浪费上限(refill waste limit)”机制如何平衡空间碎片与重新分配

TLAB 的“浪费上限”(refill_waste_limit)不是为了防止浪费本身,而是为了在**不触发 refill 的前提下,理性放弃一小块剩余空间,避免因强求填满而引发更昂贵的同步竞争**。它本质是 JVM 在碎片容忍度与分配延迟之间做的实时权衡。

浪费上限怎么算出来的

这个阈值不是固定值,而是动态计算的:

  • 初始值 ≈ 当前线程 TLAB 大小 / TLABRefillWasteFraction(默认 64,即最多允许浪费约 1.56%)
  • 但 JVM 会持续观察该线程近期 refill 行为:如果某次 refill 后很快又用尽,说明上次浪费太多、TLAB 偏小;反之若长期剩大量空间才 refill,说明浪费偏少、TLAB 可能偏大
  • 因此实际 refill_waste_limit = max(当前剩余空间 × 某衰减因子, MinTLABSize),它随分配节奏浮动,不是静态配置项

它如何影响碎片和 refill 决策

当一个对象要分配时,JVM 判断逻辑如下:

  • 若 对象大小 ≤ 剩余空间 → 直接快速分配(无浪费)
  • 若 剩余空间 > refill_waste_limit 且 对象大小 > 剩余空间 → 放弃当前 TLAB 剩余空间,在 Eden 区直接分配(称 “waste allocation”,走慢路径)
  • 若 剩余空间 ≤ refill_waste_limit → 触发 refill:尝试申请新 TLAB(可能成功,也可能失败降级)

关键点在于:第二条路径看似“浪费”,实则是主动牺牲几 KB 空间,换取完全避开 CAS 竞争;第三条路径看似“节约”,却把压力转嫁给 Eden 分配指针——高并发下多个线程同时 refill,极易卡在 CAS 重试上,造成线程停顿和内存不连续(即你看到的碎片化)。

怎么看出它正在起作用

开启 -XX:+PrintTLAB 后,重点关注每秒日志中的三个字段:

  • waste:本秒因触发 waste allocation 而丢弃的字节数(非 refill 失败导致)
  • refills:本秒成功获取新 TLAB 的次数
  • slow_alloc:本秒走 Eden 同步分配的对象数(含 waste + humongous + refill 失败降级)

典型健康信号是:waste 占 slow_alloc 的 60% 以上,且 refills 稳定在个位数/秒。这说明 JVM 正在用可控的小浪费,把大部分分配稳稳留在 TLAB 快路径上;反之,若 refills 高、waste 低,反而说明它正被逼着高频抢锁,碎片已在暗中堆积。

调优时不碰这个值,而要看它背后的行为模式

你不需要、也不应该手动设置 refill_waste_limit(它没有对应 JVM 参数)。真正要干预的是它的输入条件:

  • 若 waste 过高(>10%)且 refills 很低 → 说明 TLAB 太大,线程分配不均,启用 -XX:+ResizeTLAB 让 JVM 自动缩小
  • 若 refills 过高(>3次/秒)且 waste 很低(-XX:TLABWasteTargetPercent(提高目标利用率)
  • 若 waste 忽高忽低、refills 也抖动 → 提示业务请求对象体积分布极不均匀,需结合链路追踪定位哪类请求产生了“临界尺寸”对象(比如刚好比当前 TLAB 剩余多 1 字节的 buffer)
PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

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

相关专题

更多
java
java

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

2023.06.15

10157

6

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

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

2023.07.05

7282

9

java自学难吗
java自学难吗

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

2023.07.31

6412

8

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

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

2023.08.01

1104

3

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

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

2023.08.02

908

3

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

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

2023.08.02

1336

5

java有什么用
java有什么用

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

2023.08.02

2669

5

java在线网站
java在线网站

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

2023.08.03

19991

3

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

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1195

8

热门下载

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

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习