检测nodejs中的内存泄漏
有没有一些工具来检测nodejs中的内存泄漏? 并告诉我有关testingnodejs应用程序的经验。
以下工具对于发现内存泄漏应该是有用的:
节点检查
还有一个教程可以帮助你在这里find内存泄漏:
在追踪内存泄漏时,我尝试了上面的节点检查器。
截至2012年4月,它没有更新到与当代节点版本v0.6.12一起工作正因如此,我发现: https : //github.com/c4milo/node-webkit-agent 。
它能够显示较新的V8引擎的堆快照,而不受节点检查员支持。 在短的顺序,我能够检测到泄漏模块(在可能情况下loggly),我希望你有类似的成功!
我也可以推荐以下资源:
-
在下面的节点上,讨论了分析和内存泄漏检测工具:
-
本文 – 跟踪Node.js中的内存泄漏 – Node.JS节日季节 ,基本上汇集了所有广为人知的模块和技术来追踪内存泄漏
- 对于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/
还有一个技巧是如何检测内存泄漏“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可能是一个好主意,以便跟踪导致问题的事件。