Nodejs应用启动就占用10.4g的虚拟内存怎么回事?

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

最近一段时间,跑在 docker 里的 node 应用突然申请的虚拟内存大了起来,只要启动就达到了 10.4g ,不知道什么原因导致的,请问如何排查?
node 应用是用 ncc 打包出的一个单文件,使用 forever 启动。
docker 镜像是基于 node-22.9.0:alpine 构建。
通过 docker stats 查看容器真实内存占用是正常的,只有 92mb 。除了虚拟内存占用高,别的都正常,比如 cpu 负载。
尝试过的措施,都无法解决
1.重启 docker 容器
2.重启物理主机
3.抛弃 forever,直接使用 node 启动
4.不使用 ncc 打包成单文件,使用源代码启动
5.重新构建 docker 镜像
Nodejs应用启动就占用10.4g的虚拟内存怎么回事?


11 回复

虚拟内存怕啥啊,申请多少都无所谓


VIRT 有啥可看的,你跑一个 haskell 的程序还能吃你 1TB 呢

问题以前不这样啊,而且跑定时脚本最近老是遇到系统资源不足的报错

看 res ,不看 virt

虚拟内存不用看

我看的是 vsz

以前不这样?那就确保操作系统,node 版本,各种库的版本都跟以前一样再做比较,用排除法找出原因。也许是某个版本更新之后引入了新的内存管理方式,Go 当初也有过类似的情况。

这个 vsz 的大小不会引起资源不足,x86-64 架构下,每个进程可以有 256T 的虚拟内存地址空间。

其实现在看 RES/RSS 也不准确了,误差可以很大,要结合 PSS 一起看才准。

感谢。我改了一下定时脚本看看情况吧。以前没注意到 nodejs 的虚拟内存参数,最近频繁遇到告警邮件才注意到。nodejs 启动申请的虚拟内存都这么高吗?

#3 我们项目今天也是报了这个异常,停用了几个服务才能正常打包,上次出现这个问题是几个月前了。

针对Node.js应用启动即占用高达10.4G虚拟内存的问题,以下是一些可能的原因及解决方案:

可能原因

  1. 内存泄漏:应用中存在内存泄漏,导致内存占用不断增加。
  2. 不合理的数据结构:使用了内存占用较高的数据结构。
  3. 第三方库:某些第三方库可能内存使用不当。
  4. V8引擎内存限制:Node.js使用的V8引擎默认内存限制可能较低,但通常不会直接导致如此高的虚拟内存占用,除非显式设置了非常高的限制。

解决方案

  1. 内存分析

    • 使用process.memoryUsage()检查内存使用情况。
    • 使用内存分析工具(如heapdump、memwatch-next等)生成堆快照,分析内存使用情况。
  2. 代码优化

    • 审查代码,查找内存泄漏点,如未关闭的文件描述符、未清理的事件监听器等。
    • 优化数据结构,使用更紧凑的数据结构。
    • 避免全局变量,使用局部变量代替。
  3. 配置调整

    • 如需调整V8引擎的内存限制,可使用--max-old-space-size参数,但通常不建议设置过高。
  4. 持续监控

    • 使用PM2等工具持续监控Node.js应用的运行状态和内存使用情况。

通过以上步骤,通常可以定位并解决Node.js应用启动占用过高虚拟内存的问题。如果问题依旧存在,建议进一步分析应用的内存使用情况或寻求专业帮助。

回到顶部