Почему Node.js Сборщик мусора не собирает «соответствующий код» новой функции ()?

#javascript #node.js #memory-leaks #v8 #jit

#javascript #node.js #утечки памяти #v8 #jit

Вопрос:

Когда я запускаю bluebird’s promisify() in setInterval() , я обнаружил проблему с утечкой памяти. Существует проблема https://github.com/petkaantonov/bluebird/issues/1663 . Я сомневаюсь, что это потому, что «скомпилированный код» new Function() не может быть собран gc of nodejs . Итак, я запускаю следующий тест и записываю снимок кучи с помощью Chrome DevTools. С увеличением времени появляется все больше и больше «скомпилированного кода» new Function() .

 setInterval(() => {
    const a = new Function('a', 'console.log(a)');
    a('1');
}, 10);
  

Я хочу знать, почему Node.js gc не собирает «соответствующий код» new Function() и является ли это ошибкой?

Снимок кучи после запуска тестового скрипта. Снимок кучи

Ответ №1:

Как правило, сборщик мусора может собирать и собирает скомпилированный код, как и все остальное.

Имейте в виду, что системы сбора мусора не освобождают память сразу, когда объект выходит за пределы области видимости. В какой-то момент сборщик мусора снова запустится, определит недоступные объекты и освободит их память.

В данном конкретном случае похоже, что DevTools хранят дополнительные данные (предположительно, для целей отладки), что делает это похожим на утечку памяти — но только пока DevTools открыты. Я подал crbug.com/1141613 так что команда может взглянуть.

Комментарии:

1. О, это прекрасно 🙂