← AI 百科

内存泄漏

报错库 · 报错 / 性能 / 编程基础
一句话:程序运行过程中,不再使用的内存没有被正确释放,长时间运行后占用内存持续增长,最终可能导致服务变慢甚至崩溃。

它是什么

正常情况下,程序用完的内存应该被自动回收(大部分现代语言有垃圾回收机制),但某些代码写法会导致本该被回收的内存一直被"意外引用"着释放不掉,随着时间推移占用内存越来越多,这就是内存泄漏。

适合干什么

  • 服务运行一段时间后变慢或崩溃,怀疑是内存问题
  • 长期运行的后台服务/定时任务排查性能问题

不适合干什么

  • 刚启动服务就出现的问题(内存泄漏通常是运行一段时间后逐渐累积暴露的,刚启动就有问题大概率是别的原因)

普通人怎么用

观察服务运行的内存占用曲线,如果呈现持续上升、不会下降的趋势(而不是正常的上下波动),大概率存在内存泄漏;常见原因包括没有清理的定时器、没有移除的事件监听、无限增长的缓存/数组。

进阶用户怎么用

用语言/运行时自带的内存分析工具(如Node.js的heap snapshot、Chrome DevTools的Memory面板)对比不同时间点的内存快照,找到持续增长的对象类型,定位是哪部分代码导致的引用没有释放。

常见误区

  • 以为重启服务能"解决"内存泄漏问题,重启确实能临时释放内存,但泄漏的根本原因还在,会重复发生
  • 把正常的内存波动(比如处理大量数据时短暂升高,处理完又下降)误判为内存泄漏,真正的泄漏是持续只涨不跌的趋势

和相似工具的区别

  • 和cpu-high的区别:内存泄漏是内存占用持续增长,CPU飙升是处理器计算资源被大量占用,两者可能有关联但不是一回事,需要用不同的工具分别排查

入门步骤

  • 观察内存占用曲线判断是否真的持续增长
  • 用内存分析工具生成堆快照对比
  • 定位到具体的代码位置并修复引用未释放的问题