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