如果有用到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
你会发现内存在狂飙,这时候就出现了内存泄露
我们分析一下,根据我的经验,1.发生内存泄露一般都会执行多次,如后面*的次数 2.容易发生的一般都是如global,event等。
排查方法
- 是否是全局的。
- 二分法,把代码直接对半删,慢慢定位。