<--- JS stacktrace --->

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory

1: 00007FF78027B1EF v8::internal::CodeObjectRegistry::~CodeObjectRegistry+123599

2: 00007FF780208BA6 v8::internal::MicrotaskQueue::GetMicrotasksScopeDepth+65206

垃圾回收日志

[6696:0000028A54356A00]   544946 ms: Mark-sweep 3605.4 (4143.9) -> 3605.4 (4133.4) MB, 1330.2 / 0.1 ms  (average mu = 0.116, current mu = 0.006) allocation failure GC in old space requested
[6696:0000028A54356A00]   546398 ms: Mark-sweep 3614.8 (4142.9) -> 3614.8 (4133.2) MB, 1426.7 / 0.0 ms  (average mu = 0.067, current mu = 0.018) allocation failure GC in old space requested
  1. [6696:0000028A54356A00]:这是进程 ID 和线程 ID。6696 是进程 ID,0000028A54356A00 是线程 ID。

  2. 544946 ms546398 ms:这是自进程启动以来的时间,单位是毫秒。

  3. Mark-sweep:这是一种垃圾回收算法,它首先标记所有活动对象,然后清除未标记的对象。

  4. 3605.4 (4143.9) -> 3605.4 (4133.4) MB3614.8 (4142.9) -> 3614.8 (4133.2) MB:这表示垃圾回收前后堆内存的使用情况。括号外的数字是回收后的内存使用量,括号内的数字是回收前的内存使用量。

  5. 1330.2 / 0.1 ms1426.7 / 0.0 ms:这是垃圾回收的持续时间和暂停时间。

  6. (average mu = 0.116, current mu = 0.006)(average mu = 0.067, current mu = 0.018)mu 是垃圾回收器的并发执行程度,average mu 是平均值,current mu 是当前值。

  7. allocation failure GC in old space requested:这表明垃圾回收是因为在旧空间(old space)分配内存失败而触发的。

JavaScript 堆内存错误

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
  1. FATAL ERROR:这是一个致命错误,意味着程序无法继续执行。

  2. Ineffective mark-compacts near heap limit:这表明在堆内存接近极限时,标记-压缩操作效率低下。

  3. Allocation failed - JavaScript heap out of memory:这表示 JavaScript 堆内存已经耗尽,无法分配新的内存。

堆栈跟踪

堆栈跟踪列出了导致错误的一系列函数调用。每一行都代表一个函数调用,从上到下表示调用顺序。这些函数调用通常是 V8 引擎内部的,但也可能包括你的代码或第三方库的调用。

解决内存问题

  • 增加内存限制:使用 --max_old_space_size 参数增加 Node.js 的内存限制。

  • 优化代码:检查是否有内存泄漏,优化数据结构和算法,减少不必要的内存分配。

  • 使用内存分析工具:如 Chrome DevTools 或 Node.js 的 --inspect 参数,分析内存使用情况。

实际操作

  • 使用 node --inspect your_script.js 启动 Node.js,然后在 Chrome 中打开 chrome://inspect 进行调试。

  • 使用 node --max_old_space_size=4096 your_script.js 增加内存限制。

  • 检查代码,特别是循环、事件监听器和闭包,这些是常见的内存泄漏点。

结论

理解这些输出信息的关键是熟悉 Node.js 和 V8 引擎的内存管理机制。通过分析垃圾回收日志和堆栈跟踪,程序员可以定位问题并采取相应的措施来解决内存不足的问题。如果问题依然存在,可能需要进一步的代码审查和性能分析。

目前node项目只能在脚本里设置nodejs内存了,具体情况网上都有,虽然但是我没想到项目设置成50000m才编译起来。对于前端不甚了解,后续再说