由于其多功能性,JavaScript 仍然是最常用的编程语言之一。 要在浏览器环境之外运行 JavaScript,开发人员必须安装跨平台运行时环境 Node.js。
JavaScript 堆内存不足错误在运行 JavaScript Node.js 项目时很常见。
JavaScript heap out of memory 问题是当计算机系统分配的默认内存不足以运行一个大项目时发生的错误。
如果您遇到堆内存不足错误,您的程序将崩溃并显示此输出;
致命错误:CALL_AND_RETRY_LAST 分配失败——JavaScript 堆内存不足
或者
致命错误:无效的表大小分配失败 – javascript 堆内存不足
JavaScript heap out of memory 错误的原因
- 存在大型数据结构:使用大型数据结构(如矩阵或数组)会消耗大量空间,最终导致堆内存不足错误。
这是一个包含十亿个元素的大型数据结构的示例;
let array = []; for (let i = 0; i < 1000000000; i++) { array.push(i); }
- 糟糕的内存管理:随着应用程序的增长,您需要放弃一些不再需要的对象。
这是导致内存泄漏的函数示例;
let array = []; setInterval(function() { array.push(new Array(1000000).join("x")); }, 1000);
- 无限循环:这样的代码永远运行,因为永远不会达到终止条件。
这是一个将永远执行的无限循环的例子;
while (true) { console.log(1); }
无限循环会导致此错误,因为它使用内存的速度非常快。
- 递归函数:递归函数是一种间接或直接调用自身以重复某组/某组指令直到满足某某条件的函数。 如果这些函数设计得很好,它们很可能会导致内存导致错误,并最终导致内存堆错误。
- 一段代码中存在许多对象:如果您的代码有许多大对象,这些对象共同使用的内存会导致过载。
修复 JS heap out of memory 错误
此错误可能发生在 Windows、macOS 和基于 Linux 的操作系统(如 Ubuntu)中。 幸运的是,无论您使用何种操作系统,该错误都是可以修复的。
#1。 修复 Windows 操作系统上的 JavaScript 堆内存不足错误
第 1 步:单击开始菜单并找到高级系统设置。
第 2 步:单击对话框左下方的环境变量。
第 3 步:在用户变量或系统变量上单击新建。 第一个选项将更改应用于当前用户帐户。 但是,第二个选项将更改应用到整个系统。
第四步:会出现两个选项; 在变量名上输入 NODE_OPTIONS,在变量值上输入 –max-old-space-size=4096。 在这一步中,4096 数字将分配 4GB 虚拟内存给 Node.js。 您可以通过将值设置为 –max-old-space-size=8192 来分配更多空间,例如 8GB。
第 5 步:单击确定、应用,最后单击确定以保存更改。
您也可以使用 Windows PowerShell 终端来解决错误。 在 Windows 操作系统上打开终端并输入以下命令;
env:NODE_OPTIONS="--max-old-space-size=4096"
您也可以通过在运行您的应用程序之前运行此命令来临时解决错误;
set NODE_OPTIONS=--max-old-space-size=4096
#2。 修复 Linux 上的 JavaScript 堆内存不足错误
- 第 1 步:确定错误来源。 检查控制台日志或输出以确定导致错误的代码/文件行。
- 第 2 步:导出一个环境变量,指定您分配给 Node.js 的虚拟内存。 使用这个命令;
export NODE_OPTIONS=--max-old-space-size=4096
这些步骤将为 Node.js 分配 4GB 虚拟内存。 如果错误仍然存在,您可以通过加倍增加内存大小。
比如你想分配8GB作为虚拟内存,就可以运行这条命令;
export NODE_OPTIONS=--max-old-space-size=8192
#3。 修复 macOS 上的 JavaScript 堆内存不足错误
您可以使用与 Linux 中类似的方法解决 macOS 中的 JavaScript 堆内存不足错误。 按着这些次序;
- 第 1 步:通过检查控制台日志或输出来确定错误源,以确定导致错误的代码/文件行。
- 第 2 步:导出一个环境变量,指定您已分配给 Node.js 的虚拟内存。 使用这个命令;
export NODE_OPTIONS=--max-old-space-size=4096
这些步骤将为 Node.js 分配 4GB 虚拟内存。 如果错误仍然存在,您可以通过加倍增加内存大小。
比如你想分配8GB作为虚拟内存,就可以运行这条命令;
export NODE_OPTIONS=--max-old-space-size=8192
在 NPM 安装期间增加内存
到目前为止,我们提供的解决方案适用于运行 Node.js 应用程序时发生的错误。 但是,您可以在安装 JavaScript 包时分配虚拟内存来解决堆内存不足错误。 使用这个命令;
node --max-old-space-size=4096 (which npm) install
注意:您可以不断增加 1GB、2GB、3GB 或 4GB 的虚拟内存分配。 您必须以 MB 为单位指定内存大小。 但是,不要将机器的整个内存都分配给 Node.js,因为这可能会导致您的程序崩溃。 作为一个好习惯,如果你的机器有 16GB,你最多可以分配 8GB 给 Node.js。
防止 JavaScript 堆溢出内存错误
到目前为止,我们已经讨论了如何在发生 JavaScript 堆内存不足错误时修复它。 幸运的是,您还可以采取措施防止在运行 JavaScript 代码时发生此错误。 这些是一些最好的方法:
#1。 将数据分成小块
您可能有一个 Node.js 程序,它通过 ETL:提取 – 转换 – 加载过程从大型 CSV 文件导入大型数据集。 当您尝试导入数据时,您可能会发现您的应用程序总是崩溃。 如果您使用的是 MongoDB,则可以通过命令行指令解决错误,例如;
split -l 1000000 users.csv
此命令指示 Node.js 将名为 users 的文件拆分为多个文件,每个文件包含 1000000 个用户。 -l 标志指定应根据代码行数拆分文件。
#2。 监控内存使用情况
您可以使用内存分析器来检测代码中的内存泄漏。 您可以结合 Node.js 的内置内存和 ChromeDevTools 来实现这一点。 两者可以检测代码中的问题并修复它们。
您还可以使用 Datadog、New Relic 和 AppDynamics 等外部工具来监控应用程序的性能并采取必要的措施。 您还可以通过 process.memoryUsage() 方法检查 Node.js 应用程序的内存使用情况。
#3。 避免内存泄漏
当您的 Node.js 应用程序保留对它不再需要的对象的引用时,就会发生内存泄漏。 如果这些对象没有被垃圾收集,随着时间的推移,内存使用量将会增加。
有几种方法可以避免内存泄漏,例如避免在代码中使用全局变量,避免阻塞 I/O 操作,以及在声明变量时使用 let 和 const 关键字而不是 var。
#4。 产卵过程
如果您在内存有限的机器上运行 Node.js,例如 Raspberry Pi,您很可能会遇到内存不足的错误。 您可以有一个主进程,而其他进程被分组为工作进程。 一旦主进程检测到系统内存不足,它就会杀死该进程并将任务分配给另一个没有超载的进程。
#5。 更新硬件
如果增加内存分配和执行列出的防止堆溢出内存错误的过程不能解决您的问题,那么您可以考虑更新您的硬件。 Node.js 可以在低至 512MB 的 RAM 上运行。 但是,随着应用的增长,您的应用将需要更多的内存。
另一方面,增加 CPU 数量也可以改善内存分配。 理想情况下,2 个或更多 CPU 将允许您的应用程序将工作线程用于 CPU 密集型任务,例如加密和图像处理。
常见问题
是什么导致 JavaScript 堆内存不足错误?
此错误可能由多种原因引起;
1.内存泄漏
2.无限循环
3. 项目中存在多个对象
4. 大数据结构的存在
JavaScript Heap Out of Memory 错误是否可以解决?
是的。 您可以通过以下方式解决错误;
1. 为 Node.js 分配更多的虚拟内存
2.消除内存泄漏
3.优化你的代码
4.升级你的硬件
如何解决 React 应用程序中的堆内存不足错误?
React 是最流行的 JavaScript 库之一。 在根目录中找到 package.json 文件,并将这些行定位到脚本部分;
"scripts": { "start": "react-scripts --max_old_space_size=4096 start", "build": "react-scripts --max_old_space_size=4096 build", "test": "react-scripts test", "eject": "react-scripts eject" }
包起来
大多数开发人员在运行 Node.js 程序时习惯于错误和代码错误,而不是运行时错误。 幸运的是,您不必担心,因为堆内存不足错误是可以修复的。 我们已经定义了什么是 JavaScript 堆内存不足错误,解释了如何解决它,以及如何在你的下一个 Node.js 项目中避免它。
接下来,您还可以阅读如何避免一些常见的 JavaScript 错误。