首页 > 解决方案 > 如何检查 nodejs 堆栈和代码段内存使用情况

问题描述

我的节点进程的内存增加“缓慢”,运行时间较长(2 个月内约 1GB),但是堆保持不变(这意味着我的代码/堆栈正在增长)。我也尝试手动调用垃圾收集器,但内存使用量保持不变。

我该如何进一步调查?我想确认我的理论并弄清楚为什么我的代码段/堆栈部分会增长。

我正在使用 node v8 LTS(我知道这是今年的 EOL,我只需要知道是否有办法解决这个问题)

标签: node.jsmemory-leaksv8

解决方案


(这里是 V8 开发人员。)

V8 生成的代码在堆上,所以如果堆没有增长,那意味着代码也没有增长。

堆栈大小受操作系统限制,通常为 1-8 MB。由于操作系统只是简单地杀死运行到堆栈限制的进程,V8 对其自身施加了一个更低的限制(略小于 1 兆字节,我认为目前是 984KB),RangeError如果超过了就会抛出一个。因此,不断增长的堆栈也不是您的问题。

由于您说 Node/V8 报告的堆内存保持不变,这也意味着大多数“如何在 Node 中调试内存泄漏”教程不适用于您的情况;这可能也意味着泄漏不在您的(JavaScript)代码中。

这使得 C++“堆内存”(这与 V8 的托管“堆”非常不同!)成为最可能的罪魁祸首。Node 本身以及本机扩展可以自由分配它们自己管理的内存。也许那里的东西没有得到适当的清理。那可能只是上游错误;或者可能是您的代码中的某些内容意外地保留了一些嵌入器内存。

我首先会尝试更新 Node 和您已安装的任何本机扩展。也许泄漏已经被发现并修复。

如果这没有帮助,那么您可以尝试调查内存的去向。例如,您可以在启用 LSan 的情况下从源代码编译所有内容,并查看是否报告了任何内容。构建一个压力测试可能会有所帮助,例如一个假客户端,它用真实的请求淹没您的服务器(一个测试实例),以尝试在几秒钟或几分钟而不是几个月内触发可检查的泄漏实例。制作这样一个假客户端也可能有助于缩小出错的范围(例如:也许您会注意到一种类型的请求不会触发泄漏,但另一种类型的请求会触发)。


推荐阅读