我们使用 --max-old-space-size=8192 通过 npm test 运行完整的 E2E jest 26 测试。
node --max-old-space-size=8192 node_modules/jest/bin/jest --runInBand --coverage --detectOpenHandles --logHeapUsage --no-cache
Run Code Online (Sandbox Code Playgroud)
我们升级到节点 16.14.2,突然测试在 Windows 和 Ubuntu 20.04.4 LTS 下的 OOM 处停止在 4G。
与节点 17.8.0 的行为相同
我切换回节点 14.18.1 并使用进程资源管理器查看以下性能图。
对于节点 16,我在 E2E 测试开始时在 4G 时出现 OOM。
<--- Last few GCs --->
[14184:00000277700CA440] 1097059 ms: Mark-sweep (reduce) 2799.4 (3161.8) -> 2798.8 (3123.2) MB, 1520.8 / 0.4 ms (average mu = 0.099, current mu = 0.064) last resort GC in old space requested
[14184:00000277700CA440] 1098475 ms: Mark-sweep (reduce) 2798.8 (3123.2) -> 2798.7 (3116.2) MB, 1416.0 / 1.6 ms (average mu = 0.053, current mu = 0.000) last resort GC in old space requested
Run Code Online (Sandbox Code Playgroud)
我使用 nvm-windows 在节点版本之间切换。
这些软件包都是从 node16 开始使用 npm 安装的。它们在节点 14 上完美运行。
尝试了其他几个与空间相关的 v8 选项,但对节点 16 和 17 没有积极影响。
还不想打开 github/node 的问题,因为它无法轻易隔离。
有什么建议么?
更新:
我在 Node 16 V8 中的第一个深入发现是 --huge-max-old- Generation-size 现在默认为 true。
这将内存限制为 4G。
另请参阅https://github.com/v8/v8/commit/b2f75b008d14fd1e1ef8579c9c4d2bc7d374efd3。
和堆::MaxOldGenerationSize 和堆::HeapSizeFromPhysicalMemory
据我了解,最大旧空间限制为 4G。(至少当巨大的旧空间开启时)
现在设置 --no-huge-max-old- Generation-size --max-old-space-size=8192 仍然没有效果,并且再次在 4G 时 OOM。
更新2:
我跟踪了 v8 堆统计信息,并在 4G 的 OOM 之前查看了来自 v8.getHeapSpaceStatistics() 和 v8.getHeapStatistics() 的信息
total_heap_size : 3184 MB
total_heap_size_executable : 127 MB
total_physical_size : 3184 MB
total_available_size : 9162 MB
used_heap_size : 2817 MB
heap_size_limit : 12048 MB
malloced_memory : 2 MB
peak_malloced_memory : 44 MB
does_zap_garbage : 0 MB
number_of_native_contexts : 0 MB
number_of_detached_contexts : 0 MB
read_only_space : size : 0 MB, used: 0 MB, avail: 0 MB, phy: 0 MB
old_space : size : 2425 MB, used: 2111 MB, avail: 268 MB, phy: 2425 MB
code_space : size : 127 MB, used: 110 MB, avail: 8 MB, phy: 127 MB
map_space : size : 44 MB, used: 39 MB, avail: 4 MB, phy: 44 MB
large_object_space : size : 555 MB, used: 541 MB, avail: 0 MB, phy: 555 MB
code_large_object_space : size : 0 MB, used: 0 MB, avail: 0 MB, phy: 0 MB
new_large_object_space : size : 0 MB, used: 0 MB, avail: 15 MB, phy: 0 MB
new_space : size : 32 MB, used: 13 MB, avail: 2 MB, phy: 32 MB
<--- Last few GCs --->
[7940:000001B87F118E70] 546939 ms: Mark-sweep (reduce) 2774.1 (3123.5) -> 2773.6 (3084.7) MB, 498.6 / 0.3 ms (average mu = 0.080, current mu = 0.044) last resort GC in old space requested
[7940:000001B87F118E70] 547453 ms: Mark-sweep (reduce) 2773.6 (3084.7) -> 2773.4 (3077.2) MB, 513.2 / 0.3 ms (average mu = 0.040, current mu = 0.000) last resort GC in old space requested
<--- JS stacktrace --->
Run Code Online (Sandbox Code Playgroud)
更新3:
升级到 jest 27.5.1 没有区别。节点 14 很好,但节点 16/17 卡在 4G,而它们的堆统计数据报告有大量可用空间。
目前唯一的解决方案是使用节点 16.10.0 运行笑话测试
该问题在github.com/facebook/jest/issues/11956中进行了讨论,但建议的 jest 配置更改似乎一般都不起作用。
大型玩笑测试套件仍然会导致内存泄漏(或内存限制)发生。
| 归档时间: |
|
| 查看次数: |
3565 次 |
| 最近记录: |