升级NodeJS到v20后,我的项目在运行测试时开始遇到以下错误:

致命错误:达到堆限制分配失败-JavaScript堆内存不足

以及运行测试所需的时间超过2小时.(之前为15分钟)

该项目为大多数使用的Angular 组件构建了几千个测试.测试是用Jest执行的.

当使用NodeJS v16运行相同的测试时,不会发生该问题...(我们希望它们与 node v20一起运行)

使用6个线程并使用--logHeapUsage 标志运行测试表明,新 node 版本存在相当大的内存泄漏(堆大小天生为310MB,并且一直持续到4 GB,甚至更大):

npx jest --logHeapUsage

First block of test reports (... a lot of other ones) more test reports and the error

摘掉这张照片的错误:

                                                                                                                                                                     
<--- Last few GCs --->                                                                                                                                                                                       
                                                                                                                                                                                                             
[11248:000002CB7489B580]   762926 ms: Mark-Compact (reduce) 4031.9 (4143.6) -> 4031.7 (4143.6) MB, 5514.89 / 0.00 ms  (average mu = 0.169, current mu = 0.018) allocation failure; scavenge might not succeed
[11248:000002CB7489B580]   768007 ms: Mark-Compact (reduce) 4032.7 (4143.6) -> 4032.6 (4144.6) MB, 5078.96 / 0.00 ms  (average mu = 0.090, current mu = 0.001) allocation failure; scavenge might not succeed
                                                                                                                                                                                                             
                                                                                                                                                                                                             
<--- JS stacktrace --->



 Test suite failed to run

    A jest worker process (pid=11248) was terminated by another process: signal=SIGTERM, exitCode=null. Operating system logs may contain more information on why this occurred.

      at ChildProcessWorker._onExit (../../../node_modules/jest-worker/build/workers/ChildProcessWorker.js:370:23)

线程在突破4GB内存时死亡. 当内存堆变大时,测试似乎运行得更慢.

我的CI服务器和本地计算机可以处理suggested here GB的内存消耗,因此我将参数max-old-space-size添加为suggested here.测试将不再耗尽内存,但问题是,它们在 node v20中开始需要超过2小时才能运行,而在 node v16中需要15分钟.因此,允许内存泄漏(通过设置更大的max-old-space-size)是不可接受的结果.

我目前正在try 在测试执行过程中调用 node 的垃圾收集.我找不到一个方法来做这件事.

我应该如何继续调用 node 的垃圾回收?

或者更好的是,你会有另一个建议来帮助缓解总体泄漏吗?

推荐答案

原来这是NodeJS上的一个错误...

我发现有this issue thread个地方,人们在使用nodev20运行JEST测试时讨论内存泄漏

作为Nodev20.10(上周发布)的一部分,引入了对此的修复(详细信息请参见上面的线程链接).

我可以确认,一旦我安装了 node v20.10并重新运行测试,内存泄漏就停止了,并且测试在预期的时间范围内重新运行!

Node.js相关问答推荐

如何使用jq将依赖项添加到package.json中

如何解决无法获得本地颁发者证书的问题

Inno Setup如何在现有文本文件中追加新内容

在生产环境中,Nest实例启动时抛出不完整的导入错误

如何使用对象中的常量值验证字符串字段?

如何在mongodb中获取对象数组内部的数据

node Axios 创建全局令牌变量以在单独的变量头中使用

npm chokidar 触发事件两次

使用 mongoose 查找过go 7 天的注册用户总数

bash:npm:找不到命令?

如何在 NodeJS 中获取操作系统用户名?

在 Node.js 中的两个不同进程之间进行通信

Nodejs 随机免费 tcp 端口

添加git信息到create-react-app

向 Stripe 提交付款请求时出现没有此类令牌错误

我可以在 Heroku 中运行咖啡脚本吗?

按日期时间字段获取最新的 MongoDB 记录

请求新页面时如何将 AngularJS 路由与 Express (Node.js) 一起使用?

我应该如何在 webpack 中使用时刻时区?

为什么 Node.js 被命名为 Node.js?