Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

var largeDataArray = new Array(10000);

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

largeDataArray = null;

или если вы все еще хотите, чтобы это был массив:

largeDataArray = [];

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

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

Ответ 2

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

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