vmMemoryLimit
- 类型:
string | number - 默认值:
1 / 最大线程数
此选项仅影响 vmForks 和 vmThreads 线程池。
指定工作线程被回收之前的内存限制。
默认情况下,系统总内存会平均分配给各个工作线程。增大 maxWorkers 后,每个工作线程可用的内存会相应减少,因此工作线程也会更频繁地被回收。
合适的内存限制很大程度上取决于运行环境,因此建议手动设置,不要完全依赖默认值。
之所以需要回收工作线程,是因为 VM 上下文存在 内存泄漏:工作线程每运行一个测试文件,内存占用都会增加,因此无法一直复用同一个工作线程。设置内存限制时,需要在以下两种情况之间进行权衡:
- 较低的限制会导致工作线程被频繁回收。对于
vmThreads线程池,这项操作的开销较高:销毁工作线程时,会对该线程占用的内存执行一次完整的垃圾回收,同时还会与正在运行的测试争用进程共享的后台线程。vmForks线程池则通过结束子进程来回收工作线程,因此频繁回收的开销要低得多。 - 较高的限制会让工作线程持续占用更多内存。当所有工作线程的内存占用总量接近机器的可用上限时,所有线程池的运行速度都会下降。
提示
该实现基于 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- 千兆字节
注意
基于百分比的内存限制 在 Linux CircleCI 环境下无效,因该系统会误报内存总量。