Javascript 在Nodejs由于OOM而崩溃之前运行函数

Javascript 在Nodejs由于OOM而崩溃之前运行函数,javascript,node.js,out-of-memory,v8,pm2,Javascript,Node.js,Out Of Memory,V8,Pm2,是否可以在Node.js应用程序因OOM而崩溃之前强制其运行函数(即发送API调用) 我试图记录OOM崩溃的时间戳,但这需要能够在进程终止之前运行函数。PM2目前正用于管理此Node.js流程。 使用群集模块。分叉一个在退出事件上分叉另一个记录以下内容的工作者: 总堆大小:V8为堆分配的大小。如果使用的堆大小需要更多,则会增加。 堆大小限制:堆不能超过的绝对大小限制。e、 g:最大旧空间大小 然后它退出并生成一个新的worker,然后再次运行main函数。这可以防止在内存不足时崩溃,因为它会在内

是否可以在Node.js应用程序因OOM而崩溃之前强制其运行函数(即发送API调用)

我试图记录OOM崩溃的时间戳,但这需要能够在进程终止之前运行函数。PM2目前正用于管理此Node.js流程。

使用群集模块。分叉一个在
退出
事件上分叉另一个记录以下内容的工作者:

总堆大小:V8为堆分配的大小。如果使用的堆大小需要更多,则会增加。 堆大小限制:堆不能超过的绝对大小限制。e、 g:最大旧空间大小

然后它退出并生成一个新的worker,然后再次运行main函数。这可以防止在内存不足时崩溃,因为它会在内存不足错误触发之前退出并生成新的工作进程。如果仍然希望它崩溃,可以删除
process.exit()

heavyHeapConsumer
是一个消耗大量内存的演示函数

const cluster = require('cluster');
const v8 = require('v8');

let heavyHeapConsumer = () => {
  let arrays = [];
  setInterval(() => {
    arrays.push(new Array(1000000));
  }, 100);
};

if (cluster.isMaster) {
  cluster.fork();
  cluster.on('exit', (deadWorker, code, signal) => {
    // Restart the worker
    let worker = cluster.fork();
    
    // Note the process IDs
    let newPID = worker.process.pid;
    let oldPID = deadWorker.process.pid;
    
    // Log the event
    console.log('worker ' + oldPID + ' died.');
    console.log('worker ' + newPID + ' born.');
  });
} else { // worker
  const initialStats = v8.getHeapStatistics();
  
  const totalHeapSizeThreshold = 
    initialStats.heap_size_limit * 85 / 100;
  console.log("totalHeapSizeThreshold: " + totalHeapSizeThreshold);
  
  let detectHeapOverflow = () => {
    let stats = v8.getHeapStatistics();
    
    console.log("total_heap_size: " + (stats.total_heap_size));
    
    if ((stats.total_heap_size) > totalHeapSizeThreshold) {
      process.exit();
    }
  };
  setInterval(detectHeapOverflow, 1000);
  
  // here goes the main logic
  heavyHeapConsumer();
}