内存泄露,各位看客老爷帮忙看看是哪里出错了,内存不断的涨!就跟前段时间股票似得:(
发布于 9 年前 作者 chiedey 3885 次浏览 最后一次编辑是 8 年前 来自 问答

var request = require(‘superagent’); var async = require(‘async’);

var tasks = [ ‘http://www.baidu.com’, ‘http://www.baidu.com’, ‘http://www.baidu.com’, ‘http://www.baidu.com’, ‘http://www.baidu.com’, ‘http://www.baidu.com’, ];

setInterval(function() { async.map(tasks, function(task, callback) { request .get(task) .end(function(err, res) { callback(err, res); }); }, function(err, res) { }) }, 1000); Screenshot from 2015-07-05 18:20:22.png

11 回复

你用async.mapLimit控制下并发试试。 我之前写个简单的跟你这有点类似的东西 https://github.com/luoyjx/tag-spider

@luoyjx 试过,好像不管用

正常, Node.js 就这样,GC触发的比较慢。 如果实在看不下去了可以在启动的时候加上v8参数 --expose-gc, 然后在程序里自己手动 gc

setInterval(function() {
    async.map(tasks, function(task, callback) {
        request
            .get(task)
            .end(function(err, res) {
                callback(err, res);
            });
    }, function(err, res) {
        gc();
        console.log(process.memoryUsage());
    })
}, 1000);
  • 涨没有事,关键是你程序跑完后多长时间内存是否还是占用,这才是确定是否是内存泄露。 如果程序跑完一分钟内,内存下去了。就不是内存问题
  • 楼主这样的程序,在执行的时候肯定内存一直在攀升。关键是你如何控制在你想控制的范围内, 因为请求到的东西一直存在内存里。处理完后等待GC

@struCoder 内存一直占用,直到爆炸!!!

@wyvernnot 我看看……

别用setInterval,用node-schedule试试

时间设置太短了

@wldlzt 这两个有什么区别吗

async.map 一直在new数组,前一个map的所有请求没有完全响应,它new的数组就不会被GC,你后面的map又来了,越积越多,最后挂掉。如8楼所说,把时间设置的长一些或许会管用。最好还是用类似async.waterfall把map串起来,或者Limit所有任务,而不是setInterval里面的部分任务。

用setTimeout尾回调,就不会回调堆积了

回到顶部