解决方法:如何修复“JavaScript堆内存不足错误”
由于其多功能性,JavaScript仍然是最常用的编程语言之一。要在浏览器环境之外运行JavaScript,开发人员必须安装跨平台的运行时环境Node.js。
当运行JavaScript Node.js项目时,常见的错误是JavaScript堆内存不足。
JavaScript堆内存不足问题是当计算机系统分配的默认内存不足以运行大型项目时出现的错误。
如果遇到堆内存不足的错误,程序将崩溃并显示以下输出:
FATAL ERROR: CALL_AND_RETRY_LAST分配失败 - JavaScript堆内存不足
或
Fatal error: 无效的表大小分配失败 - JavaScript堆内存不足
JavaScript堆内存不足错误的原因
- 存在大型数据结构:使用诸如矩阵或数组之类的大型数据结构会消耗大量空间,最终导致堆内存不足错误。
以下是一个具有十亿个元素的大型数据结构示例:
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);
}
无限循环会导致该错误,因为它会快速使用内存。
- 递归函数:递归函数是一种间接或直接调用自身以重复一组指令直到满足某些条件的函数。如果这些函数设计良好,它们很可能会导致内存泄漏,并最终导致内存不足错误。
- 代码中存在许多对象:如果您的代码中存在许多大型对象,那些对象共同使用的内存可能会导致超载。
修复JavaScript堆内存不足错误
无论您使用的操作系统是Windows、macOS还是类似Ubuntu的基于Linux的操作系统,都可能出现此错误。幸运的是,无论您的操作系统是什么,都可以修复此错误。
#1. 修复Windows操作系统上的JavaScript堆内存不足错误
步骤1:点击开始菜单,找到高级系统设置
。
步骤2:点击对话框左下部的环境变量
。
步骤3:在用户变量
或系统变量
中点击新建
。第一个选项将应用更改到当前用户账户,第二个选项将应用更改到整个系统。
步骤4:会显示两个选项;在变量名
中输入NODE_OPTIONS
,在变量值
中输入--max-old-space-size=4096
。在这一步中,4096
将为Node.js分配4GB虚拟内存。您可以分配更多内存,例如8GB,将值设置为--max-old-space-size=8192
。
步骤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程序,通过链接_0:提取-转换-加载流程从大型CSV文件中导入大型数据集。您可能会发现在尝试导入数据时应用程序总是崩溃。如果您正在使用链接_1,您可以通过具有诸如以下命令行指令来解决错误;
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. 创建进程
如果您在具有有限内存的机器(如Raspberry Pi)上运行Node.js,可能会遇到内存不足错误。您可以有一个主进程,其他进程被分组为工作者。一旦主进程检测到系统的内存不足,它将终止该进程并将任务分配给未过载的另一个进程。
#5. 更新硬件
如果增加内存分配和执行上述防止内存不足错误的进程不解决问题,那么您可以考虑更新硬件。Node.js可以在512MB的RAM上运行。但是,随着应用程序的增长,您的应用程序将需要更多的RAM。
另一方面,增加CPU的数量也可以改善内存分配。理想情况下,2个或更多个CPU将允许您的应用程序使用用于CPU密集型任务(如加密和image processing)的工作线程。
常见问题解答
什么导致JavaScript堆栈内存不足错误?
此错误可能由以下原因引起;
1.内存泄漏
2.无限循环
3.项目中存在许多对象
4.存在大型数据结构
JavaScript堆栈内存不足错误是否可解决?
是的。您可以通过以下方式解决此错误;
1.为Node.js分配更多虚拟内存
2.消除内存泄漏
3.优化您的代码
4.升级您的硬件
如何解决React应用程序中的堆栈内存不足错误?
React是最受欢迎的JavaScript库之一。在根目录上找到package.json文件,并将以下行添加到scripts部分中;
"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 Errors。