memory-leak

内存持续增长的定位与修复

现象

进程 RSS 随时间持续上升,GC 后不回落,最终触发 OOM 或被重启。重启后暂时恢复,但一段时间后再次增长。

快速定位

ps -o pid,rss,vsz,comm --sort=-rss | head
cat /proc/<pid>/status | grep -E 'VmRSS|VmSwap|Threads'
cat /proc/<pid>/smaps_rollup
pmap -x <pid> | tail
top -o %MEM

语言运行时:

# Java
jcmd <pid> GC.heap_info
jmap -histo:live <pid> | head

# Go
go tool pprof http://127.0.0.1:6060/debug/pprof/heap

# Node.js
node --inspect <pid>

常见根因

  1. 缓存/Map 没有上限,只增不减。
  2. 连接、对象、线程或监听器未释放。
  3. 堆外内存、直接缓冲区、native 库泄漏。
  4. 日志或队列缓冲无限增长。
  5. 请求级对象被全局引用持有。

修复

相关命令