如何在Angular jest测试中调用Nodejs的垃圾收集?使用node v20测试速度很慢,并且会泄漏内存

h22fl7wq  于 9个月前  发布在  Jest
关注(0)|答案(1)|浏览(111)

升级NodeJS到v20后,我的项目在运行测试时开始遇到以下错误:
严重错误:达到堆限制分配失败- JavaScript堆内存不足
以及采取超过2小时运行其测试......(从15分钟前)
该项目为大多数使用的Angular 组件构建了几千个测试。这些测试是用Jest执行的。
当使用Nodejs v16运行相同的测试时,不会发生这个问题.(我们希望它们使用node v20运行)
使用--logHeapUsage标志并行运行6个线程的测试表明,新节点版本存在相当大的内存泄漏(堆大小最初为310 mb,并一直增长到4GB,甚至更高):

npx jest --logHeapUsage

字符串
x1c 0d1x(.很多其他的)

从图片中找出错误:

<--- 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服务器和本地计算机可以处理100 GB的内存消耗,所以我添加了参数max-old-space-size作为suggested here。测试将不再耗尽内存,但问题是,它们在节点v20中开始需要2个多小时才能运行,而在节点v16中需要15分钟。因此允许内存泄漏(通过设置更大的max-old-space-size)是不可接受的结果.
我正在尝试在测试执行过程中调用node的垃圾收集。我找不到方法来做这件事。
我应该如何继续调用node的垃圾收集?
或者更好的是,你有另一个建议来帮助减轻一般泄漏?

vof42yt1

vof42yt11#

原来是NodeJs上的一个bug……
我发现了这个问题线程,人们在使用nodev 20运行jest测试时讨论内存泄漏
作为节点v20.10(上周发布)的一部分,对此进行了修复(详细信息见上面的线程链接)。
我可以确认,一旦我安装了node v20.10并重新运行测试,内存泄漏就停止了,测试在预期的时间范围内恢复运行!

相关问题