Закрытие утечки памяти из неиспользуемых переменных

Я хотел бы понять, при каких обстоятельствах переменные, которые больше не используются, хранятся в замыканиях и приводят к утечкам памяти. Мой самый предпочтительный результат будет "нет ни одного", но это не так.

Из того, что я понимаю, когда функция объявлена ​​внутри другой функции, ее внутреннему [[scope]] присваивается LexicalEnvironment ее инкапсулирующей функции. Эта LexicalEnvironment имеет ссылки на локальные переменные и всю цепочку областей действия в этой точке. Это в основном включает в себявсе свободные переменные, к которым могла обращаться функция (из того, что я поняларастерянность, объяснения закрытия JavaScript).

Здесь возникает первый вопрос: это должно означатьвсе эти переменные могут быть достигнуты, пока функция живет. Например. следующее должно уже течь:

function a() {
    let big = new Array(1000000).join('*'); //never accessed
    //function unused() { big; }
    return () => void 0;
}
 
let fstore = [];
function doesThisLeak() {
  for(let i = 0; i < 100; i++) fstore.push(a());
}

doesThisLeak();

Это, к счастью, не похоже на мой Firefox. Я получил несколько объяснений, почему это не происходит, от «джиттер умный» до «LexicalEnvironment - это тип записи, который означает, что GC может собирать неиспользуемые переменные». Я до сих пор не знаю, правильно ли это, не распространяется ли это на все современные среды выполнения и почему.

После дальнейших исследований я нашелauth0, четыре типа утечек в javascript (к сожалению, похоже, что нет html-идентификатора, к которому можно перейти, релевантная часть - «4: Замыкания»), который показывает способ обмануть любую умную вещь, собирающую неиспользуемые переменные. В приведенном выше фрагменте, когда я просто раскомментирую «неиспользуемую» функцию, я не вижу, чтобы использование ОЗУ снова уменьшалось (было уже отмечено, что это может быть GC просто не запускался по другим причинам. Однако, пока, я предполагаю, что это Утечки. Я также получил сообщение, что это было ограничено Firefox, но, похоже, в Chrome аналогичное поведение)

Этот пример (в случае, если он действительно делает то, что, как я верю, делает), показывает, что полностью неиспользуемые переменные могут просочиться из-за объявления функции в той же области видимости.

В заключение мои проблемы:

В чем причина, в приведенном выше фрагменте, «большого» сбора (когда «не используется» комментируется), и происходит ли это во всех современных средах выполнения?Принимая во внимание пример с «неиспользованной» функцией без утечек, что является лучшим способом избежать таких случайных утечек? Есть еще? Я уже получил предложение обнулить все локальные переменные, которые больше не используются в конце функций, однако это кажется абсурдно безобразным. Я боюсь использовать временные переменные для предварительных расчетов и случайной утечки.

PS: довольно трудно убедиться, что этот вопрос еще не задавался в джунглях вопросов об утечках памяти с замыканиями.

Ответы на вопрос(3)

Ваш ответ на вопрос