标准答案

  1. 真实泄漏表现为相同对象引用持续保留,流量回落或清理后仍不下降;堆快照和引用链能帮助定位。
  2. 缓存无上限看 Key 数、对象大小、TTL 和淘汰策略;队列堆积看任务数量、最老任务和生产消费速率。
  3. 流量突增可能只是正常内存随并发增长,应对照请求数、响应大小、连接和 GC 判断是否超出预算。
  4. 先保护容量、限制入口和清理可丢弃任务,再修复持有引用或无界配置。

题目解析

内存增长可能来自真实对象泄漏,也可能是缓存、队列、并发请求和运行时保留堆。判断泄漏要看对象是否仍可达、增长是否在流量回落后持续,以及进程 RSS、堆和 native 内存哪一层在增长。

缓存要看 Key 数、对象大小、TTL 和淘汰,队列要看生产/消费速率和最老任务,并发要看连接和响应缓冲。只有把这些容量项拆开,才不会把正常突发误判成代码泄漏。

线上止血可以限制入口、降低批次、清理可丢弃任务或暂时重启,但长期要用增长前后堆快照、引用链和配置审计找到持有者,并设置容量上限。

常见误区

  • 误区:看到 RSS 高就重启并结束排查。改正:重启只能恢复短期容量,应保留增长曲线和快照定位泄漏来源。
  • 误区:把所有内存都归因于缓存。改正:区分堆对象、队列、连接缓冲、native 内存和运行时保留空间。
  • 误区:只做一次堆快照。改正:在不同时间和流量阶段比较快照,观察对象数量、大小和引用链是否持续增长。

作者信息