Бесконечный цикл JS: НЕУСТРАНИМАЯ ОШИБКА: неэффективная метка — сбой при выделении предела кучи — JavaScript не хватает памяти

#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') помощью тестовой функции решило проблему.