vmMemoryLimit
- Type:
string | number - Default:
1 / maxWorkers
此选项仅影响 vmForks 和 vmThreads 池。
指定 worker 在被回收前的内存限制。
默认情况下,系统总内存会在各个 worker 之间平均分配。增加 maxWorkers 后,每个 worker 可用的内存会减少,因此回收频率会更高。
此值高度取决于你的环境,因此最好手动指定,而不是依赖默认值。
之所以需要回收,是因为 VM 上下文会泄漏内存:worker 每运行一个测试文件,内存使用量就会增加,因此 worker 不可能永久运行。该限制需要在以下因素之间进行权衡:
- 较低的限制会频繁回收 worker。在
vmThreads池中,这会带来较高的开销,因为销毁 worker 线程会对该 worker 的内存执行完整的垃圾回收,并与正在运行的测试争用进程共享的后台线程。vmForks池通过让子进程退出的方式回收 worker,因此频繁回收的成本要低得多。 - 较高的限制会让 worker 累积内存。当所有 worker 的总内存使用量接近机器可承载的内存时,每个池的运行速度都会变慢。
TIP
实现参考 Jest 的 workerIdleMemoryLimit。
限制可以通过多种方式指定,最终结果会使用 Math.floor 转换为整数:
<= 1- 该值被视为系统内存的百分比。例如,0.5会将 worker 的内存限制设为系统总内存的一半。\> 1- 该值被视为固定的字节数。根据上一条规则,如果你想指定 1 字节(虽然不知道为什么),可以使用1.1。- 带单位
50%- 与上面相同,表示系统总内存的百分比。100KB、65MB等 - 使用单位表示固定的内存限制。K/KB- 千字节(x1000)KiB- 二进制千字节(x1024)M/MB- 兆字节MiB- 二进制兆字节G/GB- 吉字节GiB- 二进制吉字节
WARNING
基于百分比的内存限制 在 Linux CircleCI 上不起作用,因为报告的系统内存不正确。