36

是否有一些工具可以检测 nodejs 中的内存泄漏?并告诉我你在测试 nodejs 应用程序方面的经验。

4

7 回答 7

23

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

节点检查器

还有一个教程可以帮助您在这里找到内存泄漏:

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

于 2012-05-14T08:46:49.657 回答
10

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

于 2012-05-15T16:01:18.400 回答
6

我还可以推荐以下来源:

  1. 以下 NodeUp 剧集讨论了分析和内存泄漏检测工具:

  2. 这篇文章 - Tracking Down Memory Leaks in Node.js – A Node.JS Holiday Season,它基本上聚合了所有广为人知的模块和技术来追踪内存泄漏

  3. 对于 Mac OS - Instruments工具可能有助于调试本机 (C++) 模块。它不像 SmartOS 工具那么复杂,但很容易设置。
于 2013-05-31T11:55:47.577 回答
5

方法 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/

于 2017-09-17T00:00:26.730 回答
2

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

require()堆转储模块。

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

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

于 2014-05-23T03:13:33.740 回答
1

我使用了 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 可能是个好主意,以便跟踪导致问题的事件。

于 2015-06-15T13:36:02.767 回答
0

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

还有一个提示如何“手动”检测内存泄漏或帮助防止它,是在代码的某些地方强制垃圾收集器,看看会发生什么。

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

于 2015-06-08T16:42:58.283 回答