产生的原因:

  • 闭包
  • 未取消监听
  • 全局变量

操作步骤:

  • npm install heapdump -target=Node.js
  • heapdump.writeSnapshot(‘./‘+Date.now()+’.heapsnapshot’);
    • heapdump 可以使用 kill 向程序发送信号来打印内存快照(只在 *nix 系统上提供):kill -USR2
    • 推荐打印 3 个内存快照,一个是内存泄漏之前的内存快照,一个是少量测试以后的内存快照,还有一个是多次测试以后的内存快照。
    • node —expose-gc index.js 运行代码
    • 之后打开 devtool,点击 profile,载入内存快照,打开对比


如何避免:

  • 使用eslint等检测工具,删除不必要变量
  • 创建监听或者申请资源时记得处理销毁的情况

v8如何处理闭包:

V8 会在被闭包引用变量声明处创建一个 context2,如果被闭包的变量所在函数拥有 context1 ,则创建的 context2 的 previous指向函数 context1。在被闭包引用变量的函数内新建的函数将会绑定上 context2。