一个 Lua 内存泄露检查工具
这篇讲的是作者团队遇到服务器内存一夜暴增8G的紧急情况,通过快速自制的Lua内存快照工具定位泄露的故事。 问题出在一张地图的Lua State中,有对象持续生成却未释放引用。作者懒得搜索现有工具,自己用半天时间写了一个名为“snapshot”的开源库。它的巧妙之处在于:不对整个Lua State序列化,而是只记录table、thread等复杂对象间的引用关系,并且用C直接调用API遍历,避免了用Lua实现时“观察即改变”的干扰。 核心方法是对比两个时间点的快照,新增的内存和其引用链一目了然。工具返回的虽然是一堆指针和字符串,但足够定位到具体是哪行代码的哪个变量导致了泄露,比如示例中清晰地指向了dump.lua第7行的tmp和S1变量。 这个临时工具已经成功帮他们快速锁定了故障点,展示了在紧急问题下“轮子虽小但能快速解决问题”的实用主义思路。