本文目录#

分配速率为何重要#

高分配速率会导致频繁 GC、增加停顿与 CPU 消耗。了解分配热点与速率可指导缓存、复用与数据结构优化。

监控手段#

  • JFR:事件 Allocation in new TLABAllocation outside TLAB
  • JVM Metricsjvm_gc_allocation_bytes_total(Micrometer/Prometheus);
  • JMapjcmd <pid> GC.heap_info 观察 Eden/TLAB;
  • Async-profiler-e alloc 生成分配火焰图。

调优策略#

  1. 对象池/缓存:复用可重用对象(注意池化成本)。
  2. 原始类型优化:使用 StringBuilderThreadLocal 缓冲、LongAdder 等减少临时对象。
  3. TLAB 调整-XX:+PrintTLAB 观察 TLAB 分配;-XX:TLABSize-XX:-ResizeTLAB 控制大小。
  4. 逃逸分析:确保 JIT 能够优化为栈上分配;避免共享引用阻断优化。
  5. 数据结构选择:使用 Int2IntMap 等 primitive 集合减少包装对象。

案例步骤#

  • 采集 JFR 10 分钟;
  • 找到分配热点(例如 JSON 序列化);
  • 针对热点优化(例如启用 Jackson Afterburner、复用缓冲区);
  • 再次采样验证分配速率降低。

自检清单#

  • 是否定期监控分配速率并对异常值告警?
  • 是否评估缓存与对象池的可行性?
  • 是否利用 JFR/Profiler 定位热点代码路径?

参考资料#


本作品系原创,采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,转载请注明出处。