是否有一些工具可以检测 nodejs 中的内存泄漏?并告诉我你在测试 nodejs 应用程序方面的经验。
7 回答
在追踪内存泄漏时,我尝试了上面的节点检查器。
截至 2012 年 4 月,它尚未更新为与当代节点版本 v0.6.12 一起使用因此我发现:https ://github.com/c4milo/node-webkit-agent 。
它能够显示节点检查器不支持的较新 V8 引擎的堆快照。很快我就能够检测到泄漏的模块(在可能的情况下),我希望你也有类似的成功!
我还可以推荐以下来源:
以下 NodeUp 剧集讨论了分析和内存泄漏检测工具:
这篇文章 - Tracking Down Memory Leaks in Node.js – A Node.JS Holiday Season,它基本上聚合了所有广为人知的模块和技术来追踪内存泄漏
- 对于 Mac OS - Instruments工具可能有助于调试本机 (C++) 模块。它不像 SmartOS 工具那么复杂,但很容易设置。
方法 1 -
Node 允许我们手动触发垃圾收集,这是我们在尝试确认内存泄漏时应该做的第一件事。这可以通过运行带有 --expose-gc 标志的 Node 来完成(即 node --expose-gc index.js)。一旦节点以该模式运行,您可以随时通过从程序调用 global.gc() 以编程方式触发垃圾收集。
您还可以通过调用 process.memoryUsage().heapUsed 检查进程使用的内存量。
通过手动触发垃圾收集并检查使用的堆,您可以确定您是否确实观察到程序中的内存泄漏。当您进行此测试时,内存增长变得更加明显。
方法2 -
3 堆转储方法
Node 的 --inspect 标志登陆节点版本 6。此功能允许您从 Chrome 的 DevTools 中调试和检查您的节点进程。
只需通过 --inspect 标志启动应用程序:
$ node --inspect index.js
按照 URL 到检查器并导航到内存选项卡。
DevTools 内存选项卡
使用 autocannon -c 1 -d 60 http://localhost:PORT
[ https://www.npmjs.com/package/autocannon ]
在大约 10 秒后拍摄堆快照,并在 30 秒后再次拍摄。
堆快照比较
比较视图向我们展示了快照之间发生了什么。您可以看到大量对象已创建或未被 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/
我直接使用 Chrome 开发工具和 heapsnapshot 文件,而不是 node-inspector 或 node-webkit-agent。
require()
堆转储模块。
向正在运行的 nodejs 进程发送 usr2 信号以获取 heapsnapshot 文件。
在 Chrome 开发工具的配置文件选项卡上加载 heapsnapshot 文件。
我使用了 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 可能是个好主意,以便跟踪导致问题的事件。
一件好事是 https://github.com/bnoordhuis/node-heapdump 非常简单,您可以在 Chrome 中查看结果(因为浏览器 javascript 和 nodejs 中的 V8 引擎相同)并随时比较内存中的对象大小。
还有一个提示如何“手动”检测内存泄漏或帮助防止它,是在代码的某些地方强制垃圾收集器,看看会发生什么。
使用“node --expose-gc file.js”和代码中任何可以使用函数 gc() 的地方启动您的应用程序;调用垃圾收集。