【问题标题】:Node.JS FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed?Node.JS 致命错误:堆限制附近的无效标记压缩分配失败?
【发布时间】:2020-01-13 00:27:46
【问题描述】:

我的 Node.JS 脚本响应此错误:

错误:永远检测到的脚本被信号杀死:SIGKILL 错误: 脚本重启尝试 #15

最后几次 GC:

[11266:0x2890040] 75587 毫秒:标记扫描 1363.8 (1424.5) -> 1363.5 (1423.5) MB,1341.2 / 4.2 ms(平均 mu = 0.168,当前 mu = 0.119) 分配失败清除可能不会成功 [11266:0x2890040] 75605 毫秒:清除 1364.1 (1423.5) -> 1363.8 (1424.0) MB,11.4 / 0.0 毫秒 (平均 mu = 0.168,当前 mu = 0.119)分配失败 [11266:0x2890040] 75621 毫秒:清除 1364.4 (1424.0) -> 1364.2 (1425.0) MB,10.6 / 0.0 ms(平均 mu = 0.168,当前 mu = 0.119) 分配失败

JS 堆栈跟踪

==== JS stack trace =========================================

0: ExitFrame [pc: 0x2b010e34fb5d]
1: StubFrame [pc: 0x2b010e350eca]
Security context: 0x17ee2c91d969 2: normalizeString(aka normalizeString) [0x47fafaaaf01] [path.js:~57] [pc=0x2b010e58d424](this=0x2202476025b1 ,0x3086a38e3169 ,0x220247602801 ,0x10ca23627b19 ,0x047fafaaaf41 ) 3: /* anonymous */(aka...

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory 1: 0x90af00 node::Abort() [node] 2: 0x90af4c [node] 3: 0xb05f9e v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [node] 4: 0xb061d4 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [node] 5: 0xf0c6f2 [node] 6: 0xf0c7f8 v8::internal::Heap::CheckIneffectiveMarkCompact(unsigned long, double) [node] 7: 0xf18f88 v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [node] 8: 0xf19b1b v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [node] 9: 0xf1c851 v8::internal::Heap::AllocateRawWithRetryOrFail(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [node] 10: 0xee6834 v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationSpace) [node] 11: 0x11a0672 v8::internal::Runtime_AllocateInNewSpace(int, v8::internal::Object**, v8::internal::Isolate*) [node] 12: 0x2b010e34fb5d Aborted (core dumped)

【问题讨论】:

标签: node.js socket.io


【解决方案1】:
let express = require('express');
let app = express();
let server = require('http').Server(app);
let io = require('socket.io')(server);
class MyEmitter extends EventEmitter {}
const emitter = new MyEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
    // do stuff
    emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
app.use(express.static('public'));
app.get('/send', function(req, res) {
    res.status(200).send('hola mundo!');
});
let sms = [];
io.on('connection', function(socket) {
    console.log('alguien se a conectado con sockets');
    socket.on('newMessage', function(data) {
        sms.push(data);
        io.sockets.emit('messages', sms);
    });
    socket.on('UserRes', function(data) {
        io.sockets.emit('UserRespnse', data);
    });
    socket.on('detectUser', function(data) {
        io.sockets.emit('user', data);
    });
    socket.on('admin_notification', function(data) {
        io.sockets.emit('admin_notification', data);
    });
});
server.listen('3000', function() {
    console.log('servidor corriendo en http://localhost:3000/');
});

【讨论】:

  • 服务器配备 32gb 内存
【解决方案2】:

发生此 FATAL ERROR 的两个可能原因

  • 您要么在无限循环的每次迭代中推送数据,几秒钟后,当它到达内存空间时,服务器崩溃并显示此错误。因此,您需要检查您的代码是否存在此错误。
  • 或者,如果您真的在使用庞大的数据集并且数据集的大小已经超过节点脚本可以处理的文件大小的标准限制,那么您可以使用以下命令覆盖节点脚本处理的默认内存大小.

    node --max-old-space-size=myFileSize myFile.js
    

    例子

    node --max-old-space-size=4096 myFile.js
    

【讨论】:

    猜你喜欢
    • 2020-08-05
    • 2023-02-20
    • 2021-11-08
    • 2021-06-10
    • 2020-05-29
    • 1970-01-01
    • 2019-02-11
    • 2019-08-31
    • 2020-09-11
    相关资源
    最近更新 更多