Skip to content

vmMemoryLimit

  • 类型: string | number
  • 默认值: 1 / 最大线程数

此选项仅影响 vmForksvmThreads 线程池。

指定工作线程被回收之前的内存限制。

默认情况下,系统总内存会平均分配给各个工作线程。增大 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 环境下无效,因该系统会误报内存总量。