一句话定义:内存泄漏(Memory Leak)是指程序申请来的内存已经不再需要,却没有被归还;随着运行时间变长,被占住的内存越来越多,最终拖慢甚至拖垮整个系统。
打个比方:图书馆借书,借了不还。刚开始没人察觉,书架上少几本而已;一年后新书没地方上架,管理员每次找书还得在堆积如山的归还车里翻。书没丢,只是被“某个人还拿着”这个状态一直占着。
原理:程序运行时向系统申请内存来存放对象,比如缓存、会话状态、对话历史。多数现代语言有垃圾回收(Garbage Collection, GC),判断依据很简单:只要还有任何一条引用指向这个对象,就认为“还有人要用”,绝不回收。问题就出在这里。一个全局列表只往里加不往外删、一个事件监听器注册了却从不注销、一段闭包悄悄持有大对象、一份对话历史每轮都追加却从不截断,都会让回收器误判“它还有用”。引用链不断,内存就永远回不来。
智能体(Agent)是重灾区。常驻进程一跑几小时甚至几天,每轮对话追加消息、每次工具调用把结果塞进缓存、每个会话注册定时器和回调,日积月累。内存曲线会呈锯齿状向上:每次 GC 只能回收一部分,剩下的基线越抬越高。表现出来就是:刚启动时响应飞快,跑一天后变慢、延迟抖动,最后因内存耗尽(Out of Memory, OOM)被系统杀掉重启,然后一切重演。
和相邻概念的区别:
| 概念 | 核心区别 |
|---|---|
| 内存泄漏 | 该还的没还,内存在空闲时也持续上涨,不重启不回落 |
| 内存溢出(OOM) | 是结果而非原因,申请量超过上限,常由泄漏长期累积导致 |
| 内存占用高 | 可能是合理的大缓存,涨到某个水位后稳定不再上升 |
判断方法很朴素:看空闲期内存是否仍在爬升;做长时间稳定性压测;对比两个时间点的堆快照(Heap Snapshot),找数量只增不减的对象类型。
实际意义:对从业者,长时运行的服务和智能体要把“生命周期”当一等公民:会话结束就清理,缓存设上限并加过期策略,监听器与定时器成对注册和注销,流式响应的临时缓冲用完即放。对普通人,凡是“用久了变卡、重启就好”的软件,多半就是这个毛病。重启只是把桌子清空,并没有改掉借书不还的习惯。
