node内存泄露

245 阅读1分钟

如果有用到node的公司,比如node作后端,或者是node作服务端渲染,那么一定会遇见一个问题内存泄露 (可以说是100%)

先说公司,一般的公司都会有监控系统,比如prometheus + grafana 这是一个主流的监控。他的作用是可以实时看到cpu占用率等一系列数据,如果cpu暴增,那大概率就是出现了内存泄露。

正常的内存泄露,以node作服务端为例子,可以分为两种1.全局性内存泄露2.局部性。

局部性,即我一个服务出现内存泄露,如/xxx/xxx,会内存泄露,其他场景不会内存泄露。

全局性,即中间件等出现内存泄露。

查看内存泄露,主流的方法很多,如vscode,chrome,heapdump。

怎么查看?

专业的人做专业的事情。

我的node是v16.14.0

执行 node inspect app.js

setInterval(function testMemoryLeak() {
  const originLeakObject = leakObject
  const unused = function () {
    if (originLeakObject) {
      console.log('originLeakObject')
    }
  }
  leakObject = {
    count: String(count++),
    leakStr: new Array(1e7).join('*'),
    leakMethod: function () {
      console.log('leakMessage')
    }
  }
}, 1)

然后打开浏览器,F12会发现,有一个node的小点,点进去就是这个了

我们排查问题都会选择堆内存的快照,点击take snapshot

image.png 你会发现内存在狂飙,这时候就出现了内存泄露

我们分析一下,根据我的经验,1.发生内存泄露一般都会执行多次,如后面*的次数 2.容易发生的一般都是如global,event等。

排查方法

  1. 是否是全局的。
  2. 二分法,把代码直接对半删,慢慢定位。