CNode

内存泄露,各位看客老爷帮忙看看是哪里出错了,内存不断的涨!就跟前段时间股票似得:(

问答
Cchiedey发布于11 年前最后回复11 年前11 回复4369 浏览0 收藏

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)

W
wyvernnot#1·11 年前

正常, 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);
S
struCoder#2·11 年前
  • 涨没有事,关键是你程序跑完后多长时间内存是否还是占用,这才是确定是否是内存泄露。 如果程序跑完一分钟内,内存下去了。就不是内存问题

  • 楼主这样的程序,在执行的时候肯定内存一直在攀升。关键是你如何控制在你想控制的范围内, 因为请求到的东西一直存在内存里。处理完后等待GC

L
luoyjx#5·11 年前

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

W
wldlzt#7·11 年前

别用setInterval,用node-schedule试试

W
wldlzt#8·11 年前

时间设置太短了

C
chiedey#9·11 年前
引用 wldlzt别用setInterval,用node schedule试试

@wldlzt 这两个有什么区别吗

W
wmzy#10·11 年前

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

C
captainblue2013#11·11 年前

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

参与回复
登录后即可参与回复。登录