nodejs的内存泄漏

时间:2015-06-21 17:35:56

标签: node.js memory-leaks google-authentication

我从谷歌加载我的日历。但每次我这样做,节点使用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);
});

有谁知道如何防止内存泄漏?

1 个答案:

答案 0 :(得分:1)

那么,对于任何开发人员来说,内存泄漏主题都是一个艰难的领域,首先你需要知道是否有内存泄漏,我建议使用node inspector并执行以下操作:

1-在节点检查器上运行您的节点应用程序。

2-在新的启动时获取堆快照,以便您可以知道应用程序使用的初始内存大小。

3-做一些请求,您可以使用一些基准测试工具,同时拍摄第二张快照。

4-将快照编号1与快照编号2进行比较,检测发生增加的位置,然后注意。

5-停止发出请求并等待一点,以便我们确保垃圾收集器已完成其工作,然后拍摄第三个快照。

6-将快照3的大小与快照2进行比较,您可能会看到快照3释放的大小超过了快照2.

您可以多次执行此测试,如果最后一个快照的内存分配总是比其前任快照增加,那么您可能会发生内存泄漏。

如何修复内存泄漏?

嗯,您需要熟悉javascript中发生内存泄漏的情况,您可以阅读此article并在代码中匹配类似的情况。 然后你可以阅读你所拥有的快照尝试的详细信息并匹配线性增加的部分,并找出你的代码中有哪些数据类型或数组,对象甚至模块代码,这些代码一再被要求而且从未被处理过。

其实巧合的是,我们今天遇到了这样的情况,我们不得不通过这个故障排除步骤来解决问题。

祝你好运我的朋友。