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