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
相关产品推荐
相关产品推荐

