请教关于 Nodejs 内存相关的问题

发布于 1周前 作者 sinazl 来自 nodejs/Nestjs

请教关于 Nodejs 内存相关的问题
我写了一个网络服务,在本地做测试,每秒钟请求 20 次 ,连续请求了 11 个小时 。内存从最初一两个小时内维持在 177M 左右 ,到 11 小时后维持在在 191M 左右 ,这种情况是不是也可能是存在内存泄漏引起的 ?理论上不管运行多长时间都应该维持在 177m 左右? 测试时候的请求过程很平稳,没有极端情况。

5 回复

不写 js 。

你的测试时间还不够,跑几天再看。不过 177m 到 191m 波动应该是正常的。


因为垃圾回收任务会阶段性执行,所以理论上会在一个范围内浮动

我在 0.12 时代用 node 的时候遇到过内存泄漏问题,真是有内存泄露的话内存占用会持续攀升,直到把 V8 的额定内存空间( 64 位是 1.7G 左右)甚至系统内存空间用满。

你提供的数据差距太小,十几 M 的内存差距不好说明什么,最好做一下压测。

不知道你的压测是怎么测试的,一般压测的话都会是多线程高并发请求,比如 5 台机器每台异步发送请求,但台机器的请求频率从每秒 20 个递增到 2000 个,然后监控服务器和 node 进程的各项参数,如果有内存泄漏的话不需要那么长时间,只需要量就可以堆上来。

通常极少会看到 node 程序将内存用满,通常是 CPU 用满或者连接数用满,如果你的 node 程序不是很特殊的程序的话,你只需要在压测递增压力的时候观察一下是不是内存先于 CPU 吃满,如果是的话就说明可能有内存泄漏问题,没有的话基本上就不需要担心。

实际上在 node4.0 之后已经很少遇见内存泄漏问题了。

还有一个办法就是去 nodejs 官方的 github 上看对应版本目前 open 的 issue ,是否有和内存泄漏相关的问题。

多谢解答,我增加了请求频率,然后打印了内存使用日志,通过日志画了图像,内存确实缓慢增长的,现在已经解决这个问题了

当然,关于Node.js内存相关的问题,这里有一些关键点和技术细节供你参考。

Node.js采用V8 JavaScript引擎,具有自动垃圾回收机制,但开发者仍需注意内存管理以避免内存泄漏和性能问题。

1. 内存监控

可以使用process.memoryUsage()方法来监控内存使用情况:

const used = process.memoryUsage();
for (let key in used) {
  console.log(`${key} ${Math.round(used[key] / 1024 / 1024 * 100) / 100} MB`);
}

2. 内存泄漏检测

内存泄漏通常是由于未释放的引用造成的。你可以使用工具如heapdump和Chrome开发者工具来分析堆快照。

npm install heapdump

在代码中生成堆快照:

const heapdump = require('heapdump');
heapdump.writeSnapshot((err, filename) => {
  if (err) console.error(err);
  else console.log('Heap snapshot written to', filename);
});

3. 优化建议

  • 避免全局变量:全局变量会一直保持在内存中。
  • 及时清理回调函数:确保在不需要时释放回调函数。
  • 使用流:处理大文件或数据时,使用流来避免一次性加载到内存中。

4. 垃圾回收

V8有自己的垃圾回收机制,但在某些情况下,可以手动触发垃圾回收(仅限开发环境,不建议生产环境使用):

global.gc(); // 需启动Node.js时添加 --expose-gc 标志

希望这些信息对你有所帮助!如果有更具体的问题或场景,欢迎继续讨论。

回到顶部