用memwatch进一步查找内存泄漏

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

幸运的是,经过一番search之后,我发现了一个名为memwatch的stream行工具。 我当然安装了模块,并开始logging我的服务器进程的内存使用情况/存储。

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

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

当然,在30秒之内,这个小小的疯子提高了9mb(很不寻常)。 这是很好的,很高兴知道我的内存泄漏似乎是stringtypes,但我到底从哪里去? 有什么办法可以得到更准确的结果吗?

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

正确的做法。 使用StrongOps(以前的Nodefly)来分析内存。 隔离泄漏对象的types。 查看堆保留大小以及实例计数。 随着工作量的不断增加,实例的增长将意味着几支吸烟枪。

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

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

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

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

在您完成堆转储之后,请使用Chrome DevTools对其进行分析:

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

正如Shubhra所build议的,在帮助您诊断内存泄漏方面需要考虑的另一个工具是StrongOps监视的堆分析器。 您可以通过以下几个步骤轻松开始: http : //docs.strongloop.com/display/DOC/Setting+up+StrongOps+monitoring

在这里输入图像描述

这样可以节省您不必查看日志的时间,并可以随时查看应用程序堆中发生的情况,还可以将string与导致内存泄漏的其他可能的元凶进行比较。

你可以在这里find更多的信息: http : //docs.strongloop.com/display/DOC/Profiling#Profiling-Memoryprofiler