nodejs内存泄漏
Memory leak with nodejs
我从 google 加载我的日历。但每次我这样做时,节点都会多使用 2 MB 的内存。即使我删除了模块。我需要每 5 或 10 分钟加载一次,以便查看是否有变化。这是我的代码。
google-calender.js模块
module.exports = {
loadCalendars: function(acces, res){
gcal = require('google-calendar');
google_calendar = new gcal.GoogleCalendar(acces);
google_calendar.calendarList.list(function(err, calendarList) {
toLoadCalenders = calendarList.items.length;
loaded = 0;
data = [];
for(var i = 0; i < toLoadCalenders; i++){
google_calendar.events.list(calendarList.items[i].id, function(err, calendarList) {
loaded++;
data.push(calendarList);
if (loaded == toLoadCalenders) {
res.send(data);
}
});
}
});
}
}
main.js
app.get('/google-calender', function (req, res) {
google = require('./google-calender');
google.loadCalendars(acces, res);
setTimeout(function(){
delete google;
},500);
});
有谁知道如何防止内存泄漏?
好吧,内存泄漏话题对于任何开发人员来说都是一个棘手的领域,首先你需要知道你是否有内存泄漏,我建议使用 node inspector 并执行以下操作:
1- 运行 您的节点应用程序打开了节点检查器。
2- 在重新启动时拍摄堆快照,这样您就可以知道您的应用程序使用的初始内存大小。
3-做一些请求,你可以使用一些基准测试工具,同时拍摄第二个快照。
4-比较一号快照和二号快照,检测增加发生的地方,然后记录下来。
5- 停止发出请求并稍等片刻,以确保垃圾收集器已完成其工作,然后拍摄第三张快照。
6- 比较快照 3 和快照 2 的大小,您可能会看到快照 3 释放的大小比快照 2 多。
你可以多次做这个测试,如果最后一个快照总是比它的前一个快照有更多的内存分配,那么你可能有内存泄漏。
如何修复内存泄漏?
嗯,您需要熟悉 javascript 中发生内存泄漏的情况,您可以阅读此 article 并在您的代码中匹配类似情况。
然后你可以阅读你所拥有的快照尝试的细节并匹配线性增加的部分,并找出你的代码中哪里有这样的数据类型或数组,对象甚至模块代码,这些重复需要但从未处理过。
巧合的是,我们今天遇到了这样的情况,我们不得不通过这个故障排除步骤来解决这个问题。
祝朋友好运。
我从 google 加载我的日历。但每次我这样做时,节点都会多使用 2 MB 的内存。即使我删除了模块。我需要每 5 或 10 分钟加载一次,以便查看是否有变化。这是我的代码。
google-calender.js模块
module.exports = {
loadCalendars: function(acces, res){
gcal = require('google-calendar');
google_calendar = new gcal.GoogleCalendar(acces);
google_calendar.calendarList.list(function(err, calendarList) {
toLoadCalenders = calendarList.items.length;
loaded = 0;
data = [];
for(var i = 0; i < toLoadCalenders; i++){
google_calendar.events.list(calendarList.items[i].id, function(err, calendarList) {
loaded++;
data.push(calendarList);
if (loaded == toLoadCalenders) {
res.send(data);
}
});
}
});
}
}
main.js
app.get('/google-calender', function (req, res) {
google = require('./google-calender');
google.loadCalendars(acces, res);
setTimeout(function(){
delete google;
},500);
});
有谁知道如何防止内存泄漏?
好吧,内存泄漏话题对于任何开发人员来说都是一个棘手的领域,首先你需要知道你是否有内存泄漏,我建议使用 node inspector 并执行以下操作:
1- 运行 您的节点应用程序打开了节点检查器。
2- 在重新启动时拍摄堆快照,这样您就可以知道您的应用程序使用的初始内存大小。
3-做一些请求,你可以使用一些基准测试工具,同时拍摄第二个快照。
4-比较一号快照和二号快照,检测增加发生的地方,然后记录下来。
5- 停止发出请求并稍等片刻,以确保垃圾收集器已完成其工作,然后拍摄第三张快照。
6- 比较快照 3 和快照 2 的大小,您可能会看到快照 3 释放的大小比快照 2 多。
你可以多次做这个测试,如果最后一个快照总是比它的前一个快照有更多的内存分配,那么你可能有内存泄漏。
如何修复内存泄漏?
嗯,您需要熟悉 javascript 中发生内存泄漏的情况,您可以阅读此 article 并在您的代码中匹配类似情况。 然后你可以阅读你所拥有的快照尝试的细节并匹配线性增加的部分,并找出你的代码中哪里有这样的数据类型或数组,对象甚至模块代码,这些重复需要但从未处理过。
巧合的是,我们今天遇到了这样的情况,我们不得不通过这个故障排除步骤来解决这个问题。
祝朋友好运。