jsdom和node.js泄漏内存

我find了一些有类似问题的人参考答案,确保在完成时调用window.close()。 但是,这似乎并没有为我工作(节点0.8.14和jsdom 0.3.1)

一个简单的repro

var util = require('util'); var jsdom=require('jsdom'); function doOne() { var htmlDoc = '<html><head></head><body id="' + i + '"></body></html>'; jsdom.env(htmlDoc, null, null, function(errors, window) { window.close(); }); } for (var i=1;i< 100000;i++ ) { doOne(); if(i % 500 == 0) { console.log(i + ":" + util.inspect(process.memoryUsage())); } } console.log ("done"); 

我得到的输出是

 500:{ rss: 108847104, heapTotal: 115979520, heapUsed: 102696768 } 1000:{ rss: 198250496, heapTotal: 194394624, heapUsed: 190892120 } 1500:{ rss: 267304960, heapTotal: 254246912, heapUsed: 223847712 } ... 11000:{ rss: 1565204480, heapTotal: 1593723904, heapUsed: 1466889432 } 

在这一点上,球迷疯狂,testing实际上停止了…或至less开始非常缓慢

有没有人有任何其他的技巧比window.close摆脱内存泄漏(或者肯定看起来像内存泄漏)

谢谢!

彼得

使用jsdom 0.6.0来帮助刮掉一些数据,并遇到同样的问题。
window.close只能帮助减缓内存泄漏,但最终还是爬上来,直到进程死亡。

使用node --expose-gc myscript.js运行脚本

直到他们修复内存泄漏,除了调用window.close之外,手动调用垃圾收集器似乎工作:

 if (process.memoryUsage().heapUsed > 200000000) { // memory use is above 200MB global.gc(); } 

卡住后,调用window.close。 每次触发时,内存使用立即回落到基线(大约50MB)。 几乎感觉不到。

我和jsdom有同样的问题,转而使用cheerio ,它比jsdom快得多,即使在扫描了数百个网站之后也能运行。 也许你也应该尝试一下。 唯一的问题是,它有没有可以在jsdom中使用的所有select器。

希望它也适合你。

丹尼尔

你没有给程序空闲时间做垃圾回收。 我相信你会遇到同样的问题,任何大的对象图创build多次紧密循环没有rest。

这是由CheapSteaks的答案,手动强制垃圾回收证实。 在jsdom中不能有内存泄漏,因为定义的内存泄漏会阻止垃圾收集器收集泄漏的内存。

内存使用,清理,variables删除,window.close()

 var gb = setInterval(function () { //only call if memory use is bove 200MB if (process.memoryUsage().heapUsed > 200000000) { global.gc(); } }, 10000); // 10sec gulp.task('tester', ['clean:raw2'], function() { return gulp.src('./raw/*.html') .pipe(logger()) .pipe(map(function(contents, filename) { var doc = jsdom.jsdom(contents); var window = doc.parentWindow; var $ = jquery(window); console.log( $('title').text() ); var html = window.document.documentElement.outerHTML; $( doc ).ready(function() { console.log( "document loaded" ); window.close(); }); return html; })) .pipe(gulp.dest('./raw2')) .on('end', onEnd); }); 

对于7k的文件,我使用的是200mb到300mb之间。 花了30分钟。 这可能对某人有所帮助,因为我Googlesearch并没有发现任何有用的东西。