Node內存泄漏

收集所有存在內存泄漏的所有case。哪怕一個字節(jié)也不放過。

Case1:無限制增長的數(shù)組

varleakArray=[];exports.leak=function(){leakArray.push("leak"+Math.random());};

這個大概是最常見的內存泄漏案例。只要變量leakArray不被回收,內存就有可能無限上漲,且不被回收。

解決方案

確認你push元素的數(shù)組對象是可以隨著作用域執(zhí)行結束回收。



Case2:無限制設置屬性和值

這個情形在緩存對象中經(jīng)常出現(xiàn):

_.memoize=function(func,hasher){varmemo={};hasher||(hasher=_.identity);returnfunction(){varkey=hasher.apply(this,arguments);return_.has(memo,key)?memo[key]:(memo[key]=func.apply(this,arguments));};};

memoize方法主要是用來解決昂貴CPU耗用的js運算的。它十分有用。但是在后端使用的時候要十分小心。因為memo對象是不會回收的,每次的參數(shù)不同都會在這個對象上添加屬性和值。

這個案例中,memo對象被當作了緩存來使用,一直無法得到回收。

解決方案

關于如何規(guī)避這種無限制緩存的問題,請移步到我另開的帖子中看解決方案:http://cnodejs.org/topic/4fafc843e7656c60680306f9



Case3:任何模塊內的私有變量和方法均是永駐內存的

(function(exports,require,module,__filename,__dirname){varcircle=require('./circle.js');console.log('The area of a circle of radius 4 is '+circle.area(4));exports.get=function(){returncircle();};});

任意編寫的模塊文件中,均會在頭和尾部上添加字符串,以形成閉包,然后在require的過程中被調用一次,并且將exports對象存儲在內存中,直到進程退出才會回收。

這個案例中,只是內存不會回收,但一般不會造成內存泄漏。需要注意的是私有變量不要通過exports上的方法為其添加內存占用。

第一個案例其實就是由于這個原因造成的。



第四個案例來自于http://cnodejs.org/topic/4fcd020be5e72c25180032e5。

//OOM測試for(vari=0;i<100000000;i++){varuser={};user.name='outmem';user.pass='123456';user.email='outmem[@outmem](/user/outmem).com';}

這段代碼最主要的原因在于循環(huán)太大,直接內存分配到超過v8內存限制數(shù)量。由于JavaScript事件循環(huán)的執(zhí)行機制,這段代碼沒有機會進入下一個事件循環(huán)。用setInterval和setTimeout可以進入下一個循環(huán)。但是不推薦用setInterval和setTimeout。

在Node下有一個特殊的方法,process.nextTick();

for(vari=0;i<100000000;i++){process.nextTick(function(){varuser={};user.name='outmem';user.pass='123456';user.email='outmem[@outmem](/user/outmem).com';});}

不過這樣的效率可能不夠好。因為每次都沒有效利用好一次循環(huán)。

一個建議是,一次事件循環(huán),不要超過10ms。太長時間的事件循環(huán),不僅會存在oom的風險,還會阻塞后續(xù)IO的啟動。



http://alinode.aliyun.com/blog/37

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • topics: 1.The Node.js philosophy 2.The reactor pattern 3....
    宮若石閱讀 1,242評論 0 1
  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測試 ...
    KeKeMars閱讀 6,610評論 0 6
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,767評論 18 399
  • Node.js是目前非?;馃岬募夹g,但是它的誕生經(jīng)歷卻很奇特。 眾所周知,在Netscape設計出JavaScri...
    w_zhuan閱讀 3,735評論 2 41
  • 我很難悄悄 悄悄的如一滴雨落下 沒有閃電 或者沒有雷聲 甚至天空沒有什么變化 就悄悄的落下 我很難 我很難做到
    朱朱老老閱讀 166評論 0 1

友情鏈接更多精彩內容