2015-06-21 59 views
0

我從谷歌加載我的日曆。但每次我這樣做時,節點都會使用2 mb以上的內存。即使我刪除了模塊。我需要每5分鐘或10分鐘加載一次,以便查看是否有變化。這是我的代碼。nodejs的內存泄漏

谷歌,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); 
}); 

有誰知道我如何防止內存泄漏在這裏?

+0

僅供參考,您不會在Javascript中刪除一個變量。你不會顯示聲明變量'google'的位置,但通常你只是讓它超出範圍,如果沒有人提到它,垃圾收集器將爲你清理它。您可能需要閱讀以下內容:http://perfectionkills.com/understanding-delete/ – jfriend00

+0

要查看您是否真的有泄漏,您將不得不採取堆快照來查看實際正在使用的內容與未使用的內容內存等待重用。 – jfriend00

回答

1

好,內存泄漏的主題是一種用於任何開發一個艱難的領域,首先你需要知道,如果你有內存泄漏或沒有,我建議使用node inspector並執行以下操作:

1-運行您的節點應用程序與節點檢查器。

2-在全新開始時拍攝堆快照,以便您可以知道應用程序使用的初始內存大小。

3-做一些請求,您可以使用一些基準測試工具,同時拍攝第二張快照。

4-比較快照號碼1與快照號碼2,檢測增加發生的地方,然後注意。

5停止發出請求並稍等一下,所以我們確保垃圾收集器已完成其工作,然後拍攝第三張快照。

6-比較快照3與快照2的大小,你可能會看到快照3已經擺脫大小比快照更2.

你可以做這個測試很多次,如果總是最後一個快照具有提高記憶力分配比其前輩快照,那麼你可能會有內存泄漏。

如何修復內存泄漏?

好吧,你需要熟悉JavaScript中發生內存泄漏的情況,你可以閱讀這個article,並在你的代碼中匹配類似的情況。 然後您可以閱讀您嘗試過的快照的詳細信息,並匹配線性增長的部分,並計算出您的代碼中哪些數據類型或數組,對象甚至模塊代碼是否反覆需要且從不處理。

事實上,對於巧合,我們今天有這種情況,我們不得不通過這個故障排除步驟來解決問題。

祝你好運我的朋友。