ERR_WORKER_OUT_OF_MEMORY 在 nodejs 工作线程中

ERR_WORKER_OUT_OF_MEMORY in nodejs worker threads

当我尝试在资源受限 windows 环境中 运行 nodejs 工作线程时,我收到错误 Error [ERR_WORKER_OUT_OF_MEMORY]: worker terminated due to reaching memory limit

  1. 默认情况下每个线程的内存限制是多少?
  2. 可以增加吗?

谢谢。

查看可以传递给 Worker 构造函数的 resourceLimits 选项。

引自文档:

resourceLimits <Object>

An optional set of resource limits for the new JS engine instance. Reaching these limits will lead to termination of the Worker instance. These limits only affect the JS engine, and no external data, including no ArrayBuffers. Even if these limits are set, the process may still abort if it encounters a global out-of-memory situation.

maxOldGenerationSizeMb The maximum size of the main heap in MB.

maxYoungGenerationSizeMb The maximum size of a heap space for recently created objects.

codeRangeSizeMb The size of a pre-allocated memory range used for generated code.

我还没有看到任何关于 nodejs 如何在您不填写默认值时选择这些默认值的文章。但是指定它们可以让您进行一些控制。

我要补充一点,当试图适应资源受限的目标时,nodejs 并不是一个特别有效的内存环境。它在内存中保存可能并不真正需要的东西,就像它编译的所有原始源代码一样。它的 GC 特性赋予它比手动控制分配更广泛的内存使用范围。它在一次读取大量数据并将其解析为大量小字符串方面也特别糟糕,因为这可能导致高峰值内存使用,即使当事情平静下来时很多数据会被垃圾收集。

再举一个例子,您可以 read/parse 一个 10MB JSON 的文件,并让它占用 10 倍的内存来存储为 Javascript 数据。这并不意味着一般来说是对 nodejs 的控诉(我是它的忠实粉丝),但如果你试图适应更小的内存量,就必须更加小心地使用该工具。工作线程是一堆额外的内存开销(它自己的堆,它自己的编译代码等等),比 C/C++.

这样的东西要多得多