使用memwatch进一步查找内存泄漏

时间:2014-01-29 08:56:50

标签: node.js memory-leaks node-memwatch

最近我用node.js开始了我的第一个项目,我可以肯定地说我很喜欢它。所有模块都非常强大;然而,似乎我有一个“轻微”的内存泄漏导致我的服务器在大约一个小时后崩溃(命中99-100%的CPU)。我一直试图解决这个问题一段时间了。

幸运的是,经过一番搜索,我发现了一个名为memwatch的流行工具。我当然安装了模块,并开始记录服务器进程的内存使用/存储。

最后,在查看完日志后,我发现了可能的原因。

  {
    "what": "String",
    "size_bytes": 9421368,
    "size": "8.98 mb",
    "+": 16635,
    "-": 533
  }

当然,在30秒内,这个小小的虫子增加了9mb(非常不寻常)。知道我的内存泄漏似乎是string类型,这很好,很花哨,但我到底在哪里呢?有什么方法可以得到更准确的结果吗?

我查看了我的代码,但我的代码中确实没有string可能会像这样增长。是否有可能这个字符串实际上不是我的代码的一部分,更多的是节点或Socket.IO模块的一部分?

3 个答案:

答案 0 :(得分:3)

正确的方法。使用StrongOps(以前称为Nodefly)来分析内存。隔离泄漏物体的类型。查看堆保留大小以及实例计数。越来越多的实例计数与稳定的工作量将指向少数吸烟枪。

我相信StrongOps使用了memwatch +一些V8探查器/ GC代码。更好的自动化请参阅链接 - http://strongloop.com/node-js-performance/strongops/

然后使用node-heapdump模块,他们的联合创始人(核心贡献者Ben Noordhuis)写道将泄漏分离到集合对象,GC根和代码行。

查看Ben的博客 - http://strongloop.com/strongblog/how-to-heap-snapshots/

答案 1 :(得分:0)

您可以使用node-heapdump模块转储V8堆以供日后检查,这样您就可以看到更准确的结果。

在您进行堆转储后,使用Chrome DevTools进行分析:

https://developers.google.com/chrome-developer-tools/docs/javascript-memory-profiling

答案 2 :(得分:0)

正如Shubhra建议的那样,帮助您诊断内存泄漏的另一个工具是StrongOps监控的堆分析器。您可以通过以下几个步骤轻松开始:http://docs.strongloop.com/display/DOC/Setting+up+StrongOps+monitoring

enter image description here

这将节省您不必深入挖掘日志的时间,并让您直观地了解应用程序堆中的内容随着时间的推移,以及将String与其他可能导致内存泄漏的罪魁祸首进行比较。

您可以在此处找到更多信息:http://docs.strongloop.com/display/DOC/Profiling#Profiling-Memoryprofiler