gpt4 book ai didi

node.js - node.js 爬虫应用程序中的内存泄漏

转载 作者:搜寻专家 更新时间:2023-11-01 00:33:13 24 4
gpt4 key购买 nike

一个多月以来,我一直在与一个非常烦人的内存泄漏问题作斗争,我不知道如何解决它。

我正在编写基于以下内容的通用网络爬虫:http、async、cheerio 和 nano。从一开始,我就一直在与很难隔离的内存泄漏作斗争。我知道可以进行堆转储并使用 Google Chrome 对其进行分析,但我无法理解输出。它通常是一堆无意义的字符串和对象,导致一些匿名函数完全没有告诉我任何信息(这可能是我这边缺乏经验)。

最终我得出结论,我当时使用的库 (jQuery) 有问题,我将其替换为 Cheerio。我的印象是 Cheerio 解决了这个问题,但现在我确信它只会让它不那么引人注目。

您可以在以下位置找到我的代码:https://github.com/lukaszkujawa/node-web-crawler .我知道可能需要分析很多代码,但也许我正在做一些愚蠢的事情,这很明显。我怀疑执行 HTTP 请求的主要代理类 https://github.com/lukaszkujawa/node-web-crawler/blob/master/webcrawler/agent.js来自多个“线程”(使用 async.queue)。

如果您想运行需要 CouchDB 的代码,在 npm install 之后执行:

$ node crawler.js -c conf.example.json

我知道 Node 不会疯狂地进行垃圾收集,但经过 10 分钟的大量爬行后,使用的内存很容易超过 1GB。

(使用 v0.10.21 和 v0.10.22 测试)

最佳答案

就其值(value)而言,即使您实际使用的内存不是很大,Node 的内存使用量也会越来越大。这是为了代表 V8 引擎进行优化。要查看您的实际内存使用情况(以确定是否确实存在内存泄漏),请考虑将此代码(或类似代码)放入您的应用程序中:

setInterval(function () {
if (typeof gc === 'function') {
gc();
}
applog.debug('Memory Usage', process.memoryUsage());
}, 60000);

运行 node --expose-gc yourApp.js。每分钟都会有一个日志行指示在强制垃圾收集后立即使用的实际内存。我发现随着时间的推移观察它的输出是确定是否存在泄漏的好方法。

如果您确实发现了泄漏,我发现调试它的最佳方法是一次删除大部分代码。如果泄漏消失,将其放回原位并去除其中的一小部分。使用此方法将范围缩小到出现问题的位置。闭包是一个常见的来源,但也检查其他任何可能未清理的引用。许多网络应用程序将为不会立即销毁的套接字附加处理程序。

关于node.js - node.js 爬虫应用程序中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19989528/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com