症状识别
- 业务负载稳定,但 RSS 只涨不降。
- 堆分析看不到明显泄漏对象。
- 进程重启后内存瞬间回落。
为什么会碎片化
- 多线程下不同 size class 高频分配释放。
- 短命与长命对象混放。
- 大量临时 buffer 导致 arena 难回收。
治理路径
- 分离对象生命周期:短命池与长命池分开。
- 统一热点对象尺寸,减少跨 class 抖动。
- 评估 jemalloc/tcmalloc 与默认 allocator 差异。
线上指标建议
allocated_bytesactive_bytesresident_bytesfragmentation_ratio = resident / active
风险点
- 只看进程总内存,不看分配器内部统计。
- 盲目手写内存池,忽略线程本地缓存竞争。
- 回收策略和 NUMA 绑定冲突。
小结
碎片治理是系统工程:对象模型、分配器、线程调度、NUMA 拓扑都要协同。先观测后改造,收益才稳定。