我對抗我的節點服務器一個問題,我得到的是使節點應用崩潰的錯誤:瞭解Node.js的駐留集大小與堆大小(OOM錯誤)
FATAL ERROR: JS Allocation failed - process out of memory
我使用nodetime來查看內存使用情況。我想也許我正在縮小這個問題,但我仍然很困惑。查看這個函數,它使用Mongoose從MongoDB加載緩存的對象:
StreamCache.prototype.loadCachedStream = function(_id, callback)
{
this.model.findOne({'_id': _id}, {'objects':1,'last_updated':1}, function(err, d){
callback(err, d ? d.toObject() : null);
//The toObject() seems to cause the RSS to move into heap...?
});
};
注意到註釋行。昨晚晚上11點之前,這條線只是
callback(err,d);
我昨晚在晚上11點加了toObject()調用。
現在看我的記憶圖表:
注意這個變化之前,RSS增長,但不是堆。更改後,堆和RSS增長完全相同(直到應用程序崩潰)。請注意,內存不足錯誤(以上)在更改之前和之後都發生了。然而,這個改變似乎已經使得堆大小在其泄漏到RSS大小之前相關,在堆大小之前(ish)。
我的假設是,出於某種原因,這意味着toObject()函數將泄露的數據從RSS移動到堆中,所以不僅RSS是泄漏的,而且堆也是。
這聽起來沒錯嗎?
如果是的話......任何想法可能會導致這個問題?
您是否嘗試在啓動時和泄漏時間比較堆快照?它揭示了什麼嗎?在Nodetime中,您可以保存第一個快照(呃,現在就截圖或保存html),以便將其與漏洞時間快照進行直觀比較。注意:使用堆快照可能會使進程使用的內存增加一倍。 – logix