Javascript 在Nodejs由于OOM而崩溃之前运行函数
是否可以在Node.js应用程序因OOM而崩溃之前强制其运行函数(即发送API调用) 我试图记录OOM崩溃的时间戳,但这需要能够在进程终止之前运行函数。PM2目前正用于管理此Node.js流程。 使用群集模块。分叉一个在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函数。这可以防止在内存不足时崩溃,因为它会在内
退出事件上分叉另一个记录以下内容的工作者:
总堆大小: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();
}