我在这里寻找规范的答案。
如果我有一个如下所示的应用程序:
const {getHeapStatistics} = require("v8");
console.log(getHeapStatistics())
我得到:
{
total_heap_size: 5275648,
total_heap_size_executable: 262144,
total_physical_size: 4997120,
total_available_size: 4342409984,
used_heap_size: 3760144,
heap_size_limit: 4345298944, // 👈 4.046875GB
malloced_memory: 163968,
peak_malloced_memory: 58368,
does_zap_garbage: 0,
number_of_native_contexts: 1,
number_of_detached_contexts: 0,
total_global_handles_size: 8192,
used_global_handles_size: 2240,
external_memory: 1328787
}
现在我可以使用
heap_size_limit
节点选项来控制 max-old-space-size
值。.
如果编写一个不断向数组添加项目的应用程序,当分配的数据大小超过该值时,就会出错 - 节点不会动态增加最大大小。
似乎 4GB 是默认值,但是对此有规范的答案吗?我到处都找不到。
Stack Overflow 上还有其他问题询问:
V8 堆大小限制(无答案)
您应该考虑到默认堆大小限制实际上非常简单。
V8 在 64 位系统上将其设置为 4GB 左右,在 32 位系统上设置为 1.4GB 左右。当我的一个数据量大的应用程序不断崩溃时,我发现了这一点,我知道这很烦人......
有趣的是,V8 对于这些限制相当保守。在 64 位系统上,它将使用 4GB 默认内存或可用系统内存的一半,以较小者为准。 当您考虑一下时,这是有道理的,您不希望单个 Node.js 进程占用您的所有 RAM。
不过,您始终可以覆盖这些默认值。我在处理大型数据集时经常这样做:
node --max-old-space-size=8192 # This gives you 8GB to work with