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

猜你喜欢

转载自www.cnblogs.com/mengff/p/12960492.html
今日推荐