检测nodejs中的内存泄漏

有没有一些工具来检测nodejs中的内存泄漏? 并告诉我有关testingnodejs应用程序的经验。

以下工具对于发现内存泄漏应该是有用的:

节点检查

还有一个教程可以帮助你在这里find内存泄漏:

https://github.com/felixge/node-memory-leak-tutorial

在追踪内存泄漏时,我尝试了上面的节点检查器。
截至2012年4月,它没有更新到与当代节点版本v0.6.12一起工作正因如此,我发现: https : //github.com/c4milo/node-webkit-agent 。
它能够显示较新的V8引擎的堆快照,而不受节点检查员支持。 在短的顺序,我能够检测到泄漏模块(在可能情况下loggly),我希望你有类似的成功!

我也可以推荐以下资源:

  1. 在下面的节点上,讨论了分析和内存泄漏检测工具:

  2. 本文 – 跟踪Node.js中的内存泄漏 – Node.JS节日季节 ,基本上汇集了所有广为人知的模块和技术来追踪内存泄漏

  3. 对于Mac OS – Instruments工具可能有助于debugging原生(C ++)模块。 它不像SmartOS工具那么复杂,但是很容易设置。

我直接使用Chrome开发工具和heapnapshot文件,而不是node-inspector或node-webkit-agent。

require() heapdump模块。

发送usr2信号到正在运行的nodejs进程以获取heapsnapshot文件。

在Chrome开发工具的configuration文件选项卡上加载heapsnapshot文件。

方法1 –
节点允许我们手动触发垃圾收集,这是我们在尝试确认内存泄漏时应该做的第一件事情。 这可以通过使用–expose-gc标志运行Node来完成(即节点–expose-gc index.js)。 一旦节点以该模式运行,您可以随时通过从程序中调用global.gc()来以编程方式触发垃圾收集。

您也可以通过调用process.memoryUsage()。heapUsed来检查进程使用的内存量。

通过手动触发垃圾收集并检查堆使用,您可以确定您是否实际上观察程序中的内存泄漏。 记忆力增长变得更加明显,因为你做这个testing。

方法2 –

3堆转储方法

节点的–inspect标志位于节点版本6中。此function允许您从Chrome的DevTools中debugging和检查节点进程。

只需启动传递–inspect标志的应用程序:

$ node --inspect index.js

跟踪URL到检查器并导航到内存选项卡。

DevTools内存选项卡

在这里输入图像描述 以下是我们将要做的事情:

使用autocannon -c 1 -d 60 http:// localhost:PORT击打应用程序
[ https://www.npmjs.com/package/autocannon ]
大约10秒钟后,堆栈快照,并在30秒后再次。

堆快照比较
比较视图向我们展示了快照之间发生了什么。 您可以看到已经创build或未被GC收集的大量对象。

请阅读这些惊人的文章,了解更多。
他们一直在寻找和解决泄漏的帮助很大:

https://www.alexkras.com/simple-guide-to-finding-a-javascript-memory-leak-in-node-js/

https://www.nearform.com/blog/self-detect-memory-leak-node/

https://addyosmani.com/blog/taming-the-unicorn-easing-javascript-memory-profiling-in-devtools/

一件好事是https://github.com/bnoordhuis/node-heapdump非常简单,你可以在Chrome浏览器中查看结果(因为浏览器中的JavaScript和nodejs使用相同的V8引擎),并且可以随时比较内存中的对象大小。

还有一个技巧是如何检测内存泄漏“manualy”还是有助于防止它,是强制垃圾收集器在你的代码的一些地方,看看会发生什么。

用“node –expose-gc file.js”和代码中的任何地方启动你的应用程序,你可以使用函数gc(); 调用垃圾回收。

我使用了npm包Memwatch:

看看Github存储库和NPM源代码

基本上,这个包在V8引擎执行垃圾收集之后立即检查内存堆的使用情况,并为您提供实际内存使用情况的基准。

以下是我使用它的方式:

 var memwatch = require('memwatch'); memwatch.on('leak', function(info) { console.log('Memwatch leak: '); console.log(info); }); memwatch.on('stats', function(stats) { console.log.message('Memwatch stats: '); console.log(stats); }); 

从原始文件:

偶尔发出的'stats'事件会为您提供描述您的堆使用情况和趋势的数据。

'leak'事件是在代码泄露内存时发出的。 通常在堆的大小在短时间内持续增长时执行。

Memwatch还提供了一个“HeapDiff”类,用于计算可以在函数中执行的两个快照之间的堆状态。

在您的舞台环境中运行memwatch可能是一个好主意,以便跟踪导致问题的事件。