升级NodeJS到v20后,我的项目在运行测试时开始遇到以下错误:
致命错误:达到堆限制分配失败-JavaScript堆内存不足
以及运行测试所需的时间超过2小时.(之前为15分钟)
该项目为大多数使用的Angular 组件构建了几千个测试.测试是用Jest执行的.
当使用NodeJS v16运行相同的测试时,不会发生该问题...(我们希望它们与 node v20一起运行)
使用6个线程并使用--logHeapUsage
标志运行测试表明,新 node 版本存在相当大的内存泄漏(堆大小天生为310MB,并且一直持续到4 GB,甚至更大):
npx jest --logHeapUsage
(... a lot of other ones)
摘掉这张照片的错误:
<--- 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 的垃圾回收?
或者更好的是,你会有另一个建议来帮助缓解总体泄漏吗?