Средний: обнаружение переполнения кучи на Node.js: JavaScript нехватка памяти
Использует модуль кластера. Разветвляет воркер, который при событии exit
разветвляет другой воркер, который регистрирует:
total_heap_size: размер, выделенный V8 для кучи. Он может увеличиваться, если used_heap_size нужно больше. heap_size_limit: абсолютный предел размера, который не может превышать куча. например: max_old_space_size
Затем он завершает работу, порождает нового рабочего и снова запускает основную функцию. Это предотвращает сбой при нехватке памяти, поскольку он завершается до того, как сработает ошибка нехватки памяти, и порождает новый рабочий. Если вы по-прежнему хотите, чтобы он взломал sh, вы можете удалить 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();
}