请求大型JSON对象会导致内存泄漏

时间:2016-11-01 14:38:42

标签: node.js memory-leaks needle.js

我有一个简单的NodeJs应用程序,它充当REST客户端并请求大型JSON对象。问题是它总是耗尽内存(超过6Gb)。我正在使用手动垃圾收集(应用程序以--expose_gc开头),但这似乎没什么帮助。

这是我的代码:

var needle = require('needle');
function getAllData() {
    getDataFromUrl("http://puppygifs.tumblr.com/api/read/json");
    getDataFromUrl("http://puppygifs.tumblr.com/api/read/json");
    getDataFromUrl("http://puppygifs.tumblr.com/api/read/json");
    getDataFromUrl("http://puppygifs.tumblr.com/api/read/json");
    getDataFromUrl("http://puppygifs.tumblr.com/api/read/json");

    setInterval(function () {
        getAllData();
    }, 10 * 1000);
}

function getDataFromUrl(url) {
    needle.get(url, function (error, response) {
        if (!error && response.statusCode == 200) {
            console.log("do something");
        }
    });
}

function scheduleGc() {
    global.gc();
    setTimeout(function () {
        scheduleGc();
    }, 100 * 1000);
}

getAllData();
scheduleGc();

我尝试过请求库,但结果相同。我做错了什么?

P.S。我的nodejs版本是6.9.1,针版本1.3.0

3 个答案:

答案 0 :(得分:0)

使用节点检查器查找泄漏。它可能是内部nodejs泄漏或针头和请求泄漏。我更喜欢使用原生http.request来确保它不是库问题。您还可以将代码拆分为独立的部分并单独运行以找到泄漏源。

another answer如何检测内存泄漏。

答案 1 :(得分:0)

我发现了一个错误。我使用的是setInterval而不是setTimeout ....

var needle = require('needle');
function getAllData() {
    getDataFromUrl("http://puppygifs.tumblr.com/api/read/json");
    getDataFromUrl("http://puppygifs.tumblr.com/api/read/json");
    getDataFromUrl("http://puppygifs.tumblr.com/api/read/json");
    getDataFromUrl("http://puppygifs.tumblr.com/api/read/json");
    getDataFromUrl("http://puppygifs.tumblr.com/api/read/json");
}

function getDataFromUrl(url) {
    needle.get(url, function (error, response) {
        if (!error && response.statusCode == 200) {
            console.log("do something");
        }
    });
}

function scheduleGc() {
    global.gc();

    setTimeout(function () {
        scheduleGc();
    }, 100 * 1000);
}

setInterval(function () {
    getAllData();
}, 10 * 1000);

scheduleGc();

答案 2 :(得分:0)

这是因为你正在使用太多信息,6Gb应该用来处理。
 使用非常容易,只需避免回调 这是一个例子:

'use strict';
 const needle = require('needle');
 const fs = require('fs');
 const out = fs.createWriteStream('bigFile.json');
 needle.get('http://puppygifs.tumblr.com/api/read/json').pipe(out);