node內存泄漏總結


1. node內存泄漏情形

1.1 全局變量

全局變量不會被回收,需要手動設置為null或undefined

1.2 閉包

function out() {
  const bigData = new Buffer(100);
  inner = function () {
    void bigData;
  }
}

比如閉包中的變量被全局對象引用,則閉包中的局部變量,不能釋放。inner是全局對象,bigData是局部變量。

1.3 緩存

服務器有並發和長時間運行的情況,若使用memoize等本地緩存,緩存的key長時間不能釋放,會造成內存泄漏

1.4 監聽器

事件監聽器或socket listen錯誤的重復添加,忘記移除,會造成內存泄漏

2. node內存泄漏排查方式

2.1 首先從系統層面

用系統工具,觀察內存和CPU使用變化,持續升高,則是內存泄漏

2.2 node-heapdump抓取快照

node-heapdump抓取內存快照, 得到profile文件,chrome的Memory工具,load profile文件,可以將多個profile導入,通常要3個,方便對比。

可以查看哪些對象有異常,對比3次的profile的差異。

具體可參考 Node.js 性能調優之內存篇(二)——heapdump

3. 避免內存泄漏

3.1 ESLint規范代碼
3.2 避免復雜的閉包
3.3 一定要關閉事件監聽和socket listen


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM