Как освободить память в JavaScript


Я работаю с canvas и его объектом ImageData, который содержит огромное количество данных (миллионы целых чисел). Поэтому работа с несколькими массивами уже занимает много памяти (до 300 МБ). Есть ли способ освободить память некоторого массива, когда это не нужно? Я пытаюсь назначить undefined переменной. Это правильно?

2 58

2 ответа:

если переменная сохраняется (например, она является глобальной или частью некоторой постоянной структуры данных) и данные, на которые она указывает, велики, и вы хотите, чтобы эти данные были пригодны для сборки мусора, тогда вы правильно назначаете что-то маленькое этой переменной. undefined или null или "" все будет работать. То, что вы делаете, - это очистка ссылки на большие данные, чтобы она имела право на сбор мусора. Если ничто другое в вашем javascript не имеет ссылки на эти данные, то это может быть освобожден сборщиком мусора. Если что-то еще имеет к нему отношение, то оно не может быть освобождено.

например, если массив из 10 000 элементов хранится в глобальной переменной:

var largeDataArray = new Array(10000);

и, вы заполнили большинство элементов данными, то вы могли бы позволить этой памяти, чтобы иметь право на сбор мусора, присвоив ему какое-то другое значение, как:

largeDataArray = null;

или если вы все еще хотите быть массив:

largeDataArray = [];

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

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

JavaScript имеет автоматическое управление памятью. Память, содержащая объекты, на которые больше не ссылаются, будет иметь право на сборку мусора, если у вас нет утечки памяти. обычно нет необходимости вручную назначать undefined переменные.

если ваша программа использует слишком много памяти, вы должны shrink массивы, чтобы избавиться от элементов вам больше не нужно. Смотрите Array.pop,Array.shift, и Array.splice.