本版本包含超过160个提交,专注于技术债务清理,包括重构、缺陷修复、测试覆盖提升与选项清理,并据上游问题报告改进可移植性。新功能新增范围分配标志钉住(EXTENTALLOCFLAG_PINNED),使自定义范围分配钩子(extent-allocation hooks)可标记大页(HugeTLB pages)等不可回收映射在衰减清除管道外优先重用,并添加 mallctl 接口报告钉住内存与互斥统计;允许通过线程竞技场(thread.arena)恢复每CPU竞技场选择等。
正文
本次发布包含超过 160 次提交,重点清理技术债务,包括重构、缺陷修复、提升测试覆盖率以及清理选项,还根据上游问题报告做了可移植性改进。
新特性
新增 EXTENTALLOCFLAGPINNED,使自定义 extent 分配钩子能将不可回收的映射(如 HugeTLB 页面)标记为优先在衰减和清除流程之外复用。新增 mallctl 接口 stats.pinned、stats.arenas..pinned、stats.arenas..extents.
允许通过 thread.arena 恢复每 CPU 的 arena 选择。(@Algunenano: 68c35f6)
使 malloc 统计的人可读内容与 JSON 格式内容更一致。(@spredolac: 68fe1be, 30b1a41, 04aad97)
用编译期选项 --enable-cxx-infallible-new 替换运行期 experimentalinfalliblenew 选项,以实现编译器级优化及移动构造函数中的优化,并修复 new(std::nothrow) 契约。(@spredolac: 160ab9d, fe33667)
不兼容变更
根据 GC 事件之间观察到的需求调整各 bin 的 tcache 填充与保留目标,取代固定的 refill/flush 策略。移除七个旧的非实验性控制项:lgtcachenslotsmul、tcachenslotssmallmin、tcachenslotssmallmax、tcachenslotslarge、tcachegcdelaybytes、lgtcacheflushsmalldiv 和 lgtcacheflushlargediv。对应的 mallocconf 设置会被静默忽略,相关的 opt.* mallctl 返回 ENOENT,tcachencached_max 仍受支持。(@spredolac: d13fe91)
Bug 修复
在 free、freesized、freealignedsized 调用以及基于 processmadvise 的页面清除过程中保持 errno 不变。(@spredolac: 3a77966, 86f0582)
修复尺寸类中的数值溢出检查。(@spredolac: 6b24522)
在 freesized() 和 freealigned_sized() 中接受 NULL(符合 C23)。(@bigbruno: 7ce8b91)
修复 TSD 生命周期边界情况:1) 在标记缓存启用前初始化线程缓存 bin,防止重入引导分配使用未初始化状态;2) 在通用 TSD 平台上,避免线程拆卸后为晚期释放重新创建 TSD。(@fzakaria: 54f22c8, @spredolac: fb5499a)
在 initthpstate 中打开 THP sysfs 文件时使用 O_CLOEXEC。(@ibookstein: d070554)
修复 mallocstatsprint 输出中重复的 opt.statsprint 和 opt.statsprint_opts 字段。(@spredolac: dfe3a2e)
修复 arena_reset 期间潜在的死锁。(@guangli-dai: 6957341)
修复 SAN 中性能分析采样与守护页交互的缺陷。(@gctony: e36a0fa)
优化与重构
通过将 arena 管理、初始化、fork 编排和分配调度从 jemalloc.c 中抽取出来,模块化 jemalloc 前端;理清 tcache/arena 归属;合并内部头文件关系图以消除循环依赖。(@spredolac: ba1e2fe, 8874597, 9d75722, de9ad14, ...)
通过重构 arena 辅助函数、将仅实现用的控制项内部化、用类型化辅助函数替换控制流宏、并按子系统组织 ctl.c,简化 ctl 调度。(@spredolac: 9e14346, 901365d, 4e903a0, 5bc8d6e)
限制基块增长启发式,避免在罕见竞态条件下虚拟内存耗尽。(@guangli-dai: 2f4db8c)
将后台线程生命周期与状态操作移入后台线程模块,明确其独立于 PAC/HPA 调用方的归属。(@guangli-dai: f1f0792)
通过用直接 PAC/HPA 调用替换 PAI 虚表调度、移除过时的 pai_t / pai.h 抽象、并将延迟工作和衰减编排移出 arena,简化页面分配边界。(@guangli-dai: 1dfa6f7, 8edd101, d410f43)
将统计信息收集与渲染重构为独立的 gather/emission 阶段和描述符驱动表。(@spredolac: 184f304, 80c8fcb)
引入操作系统抽象层,将平台相关的文件/进程 I/O、时间、同步、CPU、虚拟内存、atfork、错误处理、性能分析、线程让出和配置访问操作移出分配器核心代码。(@guangli-dai: c4158ac, c8e2e01, ...)
可移植性改进
评论
部分用户质疑该发布为何获首页关注且背景信息不透明,少数人提供背景链接或提出技术疑问,社区中夹杂轻松玩梗。
对该版本发布的背景与维护者信息不足感到疑惑
- 用户好奇更新为何受关注,并指出项目主页与仓库未提及创始人 Jason Evans,且自2022年久未发布后突更,期望了解当前维护主导方与 Meta 是否仍参与(少数人) > 为何主页和仓库都不提 Jason Evans,自2022年没更新现在突然发布,希望有点背景(@ksec)
提供关联背景链接以解释关注度
- 有用户贴出此前关于 jemalloc 的事后分析讨论,作为该发布值得注意的上下文(少数人) > 相关背景可参考此前 jemalloc 的事后分析帖(@vocx2tx)
疑惑 tcmalloc 缓存架构改变的平台兼容性
- 读者提问为何仅 tcmalloc 从线程缓存转向 CPU 缓存,担忧 Linux 与其他平台行为因此分化(少数人)
调侃项目名疑似法语构造
- 有人玩梗将名称联想为法语“我分配内存”,体现社区轻松氛围(少数人) > 这名字是法语吗,意为我分配点内存?(@lordnacho)
有价值的补充
- 持续维护对 Ruby on Rails 应用性能改善明显,有用户对此表示肯定。