Nodejs FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory内存溢出我要怎么知道挂在哪句

Nodejs FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory内存溢出我要怎么知道挂在哪句

自己本机测试可以的,用ab进行100次100并发也是可以的。但是放到真实环境中,过一段时间就FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory,我要怎么知道到底是挂在哪里啊。又没指名道姓那一句话挂了。。。

还望好心人帮帮忙,可以提供代码供找错,谢谢~

4 回复

如何定位 Node.js 中的内存溢出问题

当你遇到 FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory 错误时,这通常意味着你的 Node.js 应用程序在尝试分配更多内存时失败了。这种情况可能是由于内存泄漏或一次性分配大量数据导致的。

为了帮助你更好地理解如何定位这个问题,以下是一些方法和一个简单的示例代码来演示如何检查内存使用情况。

1. 使用内置的 --inspect 和 Chrome DevTools

你可以通过启动 Node.js 进程时添加 --inspect 参数来启用调试器,并使用 Chrome DevTools 来查看内存使用情况。

node --inspect app.js

然后在浏览器中打开 chrome://inspect,选择你的进程并开始调试。在 DevTools 的 “Memory” 面板中,你可以看到内存快照并分析内存使用情况。

2. 使用 process.memoryUsage()

你可以通过 process.memoryUsage() 方法来获取当前 Node.js 进程的内存使用情况。

const memoryUsage = process.memoryUsage();
console.log(memoryUsage);

输出将包含不同类型的内存使用情况:

{
  rss: 28953344,
  heapTotal: 12008448,
  heapUsed: 7024468,
  external: 11420
}

3. 示例代码

假设你有一个应用程序,它试图处理大量数据并可能导致内存溢出。

const fs = require('fs');

function readLargeFile(filePath) {
  const data = fs.readFileSync(filePath, 'utf8');
  // 处理数据...
}

readLargeFile('/path/to/large/file.txt');

在这个例子中,如果文件非常大,同步读取整个文件可能会导致内存溢出。我们可以改为异步读取文件以避免这个问题:

const fs = require('fs');

function readLargeFile(filePath) {
  fs.readFile(filePath, 'utf8', (err, data) => {
    if (err) throw err;
    // 处理数据...
  });
}

readLargeFile('/path/to/large/file.txt');

4. 使用 heapdump 模块生成堆转储

你可以使用 heapdump 模块生成堆转储文件,然后分析这些文件以找出内存泄漏的原因。

npm install heapdump
const heapdump = require('heapdump');

// 在某个点生成堆转储
heapdump.writeSnapshot('/path/to/snapshot.heapsnapshot', (err, filename) => {
  if (err) throw err;
  console.log(`Heap dump written to ${filename}`);
});

通过上述方法,你可以更好地了解内存使用情况并定位到具体的代码行。希望这些方法能帮助你解决内存溢出问题。


连了几个就报这个错误…是什么原因里?

当你的 Node.js 应用遇到 FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory 错误时,这通常意味着你的程序在尝试分配更多内存时超出了 V8 引擎的限制。要找到具体是哪一部分代码导致了这个问题,你可以采取以下几个步骤:

1. 使用堆栈跟踪工具

Node.js 提供了一个内置的内存泄漏检测工具 --trace-warnings--expose-gc,可以帮助你找出问题所在。

node --trace-warnings --expose-gc your-app.js

当你运行这个命令时,Node.js 将会在发生错误时打印更多的调试信息,包括可能引起问题的代码行。

2. 增加内存限制

你可以通过以下命令增加 Node.js 的内存限制:

node --max-old-space-size=4096 your-app.js

这里将内存限制增加到了 4GB。如果问题依然存在,说明可能是数据量过大或者某些对象没有被正确释放。

3. 使用性能分析工具

你可以使用 Node.js 自带的性能分析工具 --prof 来帮助你定位问题。运行应用后,生成的日志文件可以通过 node-tick-processor 进行解析:

node --prof your-app.js
node-tick-processor v8.log

这会生成一个详细的报告,帮助你识别占用大量内存的部分。

示例代码:简单地监控内存使用情况

为了更好地理解问题,你可以先从监控内存使用开始:

setInterval(() => {
    const used = process.memoryUsage().heapUsed / 1024 / 1024;
    console.log(`The script uses approximately ${Math.round(used)} MB`);
}, 1000);

这段代码每隔一秒打印当前应用使用的内存,可以帮助你观察内存增长情况。

通过上述方法,你应该能够更好地定位到导致内存溢出的具体代码段。

回到顶部