我有一个简单的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
答案 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);