是否可以在Node.js应用因OOM崩溃之前立即强制运行一个函数(即发送API调用)?
我正在尝试记录OOM崩溃的时间戳,但这需要能够在进程终止之前运行功能。 PM2目前正用于管理此Node.js流程。
答案 0 :(得分:1)
Medium: Detect heap overflow on Node.js: JavaScript heap out of memory
使用集群模块。派遣一个在exit
事件上发生事件的工作人员,派生另一个记录的工作人员:
total_heap_size:已为堆分配的大小为V8。如果used_heap_size需要更多,则此数量可能会增加。 heap_size_limit:堆不能超过的绝对大小限制。例如:max_old_space_size
然后退出并产生一个新的worker,然后再次运行main函数。这样可以防止内存不足崩溃,因为它会在触发内存不足错误之前退出并生成新的worker。如果您仍然希望它崩溃,则可以删除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();
}