You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NodeJS出现FATAL ERROR:CALL_AND_RETRY_LAST内存分配失败求助

解决Node.js中FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory错误

兄弟,我一眼就瞅出问题根源了——你的代码里藏着个无限死循环!这才是内存直接爆掉的核心原因,跟Node.js默认的内存限制压根没关系,难怪你之前调内存的方案全不管用。

问题出在哪?

看你这段代码:

var http = require("http"), fs = require("fs");
http.createServer(function(req, res){
 fs.readFile("./index_ASYNC.html", function(err, html){
 var i=0;
 while(true) {
 i++; res.write(i+""); // Envía respuestas al navegador.
 }
 // res.writeHead(200,{"Content-Type":"text/html"});
 res.end();
 });
}).listen(8080);

在fs.readFile的回调函数里,你写了个while(true)的死循环,一直在执行res.write(i+"")。Node.js的响应对象res会把你写入的所有数据先缓存到内存里,直到你调用res.end()才会把缓存的数据一次性发给客户端。但这个死循环永远不会停止,一直在往内存里塞数据,最后直接把JavaScript堆内存撑爆,就出现了你看到的那个报错。

怎么修复?

你得把这个无限循环改成合理的逻辑,比如限制循环次数,或者用异步方式避免阻塞事件循环。这里给你一个修正后的示例:

var http = require("http"), fs = require("fs");
http.createServer(function(req, res){
  fs.readFile("./index_ASYNC.html", function(err, html){
    // 先处理文件读取错误
    if (err) {
      res.writeHead(500, {"Content-Type": "text/plain"});
      res.end("加载文件失败: " + err.message);
      return;
    }

    // 恢复响应头设置,让客户端正确识别内容类型
    res.writeHead(200,{"Content-Type":"text/html"});
    
    // 改成有限循环,比如输出100次数字
    for(var i=0; i<100; i++) {
      res.write(i + "<br>");
    }
    
    // 最后输出读取的HTML内容并结束响应
    res.end(html);
  });
}).listen(8080);

额外提示

如果以后需要处理大量数据输出(比如大文件),建议用流式输出,比如用fs.createReadStream读取文件,然后通过pipe方法直接把数据流发给响应对象,这样就不会把所有数据都加载到内存里,能有效避免内存溢出问题。

内容的提问来源于stack exchange,提问作者URKA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:44:23