症状识别

  • 业务负载稳定,但 RSS 只涨不降。
  • 堆分析看不到明显泄漏对象。
  • 进程重启后内存瞬间回落。

为什么会碎片化

  • 多线程下不同 size class 高频分配释放。
  • 短命与长命对象混放。
  • 大量临时 buffer 导致 arena 难回收。

治理路径

  1. 分离对象生命周期:短命池与长命池分开。
  2. 统一热点对象尺寸,减少跨 class 抖动。
  3. 评估 jemalloc/tcmalloc 与默认 allocator 差异。

线上指标建议

  • allocated_bytes
  • active_bytes
  • resident_bytes
  • fragmentation_ratio = resident / active

风险点

  • 只看进程总内存,不看分配器内部统计。
  • 盲目手写内存池,忽略线程本地缓存竞争。
  • 回收策略和 NUMA 绑定冲突。

小结

碎片治理是系统工程:对象模型、分配器、线程调度、NUMA 拓扑都要协同。先观测后改造,收益才稳定。