#javascript #recursion #memory #infinite-loop
#javascript #рекурсия #память #бесконечный цикл
Вопрос:
Получение ошибки кучи памяти при выполнении бесконечного цикла
function test() {
let pairContract;
for (let i = 0; i < 1000; i ) {
let pairContract = new web3.eth.Contract(UNISWAP_ABI, '0x2e81ec0b8b4022fac83a21b2f2b4b8f5ed744d70');
pairContract = null;
}
}
const init = () => {
do {
test();
} while (1);
};
init();
По сути, новый web3.eth.Contract генерирует сложный объект.
Проблема, по-видимому, заключается в том, что каждый экземпляр pairContract никогда полностью не удаляется из памяти после предыдущего выполнения test() .
Я попытался заменить do while на setInterval, но это не сработало. Также попробовал рекурсивный подход с помощью process.nextTick в конце тестовой функции, но это тоже не сработало.
Увеличение —max-old-space-size приводит к тому же коду ошибки, что и указано в названии.
Версия узла: v12.20.0
Комментарии:
1. Рекурсивный
setInterval
или асинхронный подход выглядит разумным, с какими проблемами вы столкнулись с ним?2. Я получил ту же ошибку: НЕУСТРАНИМАЯ ОШИБКА: неэффективная метка-сжатие вблизи предела выделения кучи не удалось — JavaScript куча из памяти
3. Похоже, вы не даете ему достаточно времени для сбора мусора
4. @CertainPerformance Я не знал, что я должен уделять время сбору мусора. Я довольно плохо разбираюсь в управлении памятью. Вы предлагаете мне где-нибудь добавить таймер?
5. Попробуйте дать ему больше времени. Увеличьте время ожидания до 10 или 30 секунд или около того и посмотрите, сможете ли вы заметить разницу.
Ответ №1:
Найден ответ. Оказалось, что использование экземпляра web3 с глобальной областью действия для создания pairContract не позволило собрать мусор.
Создание экземпляра web3 с const web3 = new Web3('http://localhost:8545')
помощью тестовой функции решило проблему.