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

Как вы очищаете память в Javascript?

var Obj = function(){}; var X = new Obj();

будет X = null правильно очистить память?

Также это было бы эквивалентно?

var Obj = function(){}; 
var X   = {}; 
X.obj   = new Obj();
delete(X.obj);

ИЗМЕНИТЬ Казалось бы, хотя удаление X.obj не сразу очистит память, это поможет сборке мусора. Если я не удалю X.obj, все равно будет указатель на объект, и GC не сможет его очистить.

Хотя я выбираю @delnan ответ, если вы читаете это, вы должны также уловить статью Benubird.

Я также замечаю, что я случайно написал delete (X) изначально вместо delete (X.obj) - извините.

4b9b3361

Ответ 1

Короткий ответ заключается в том, что вы этого не делаете. delete просто удаляет ссылку (и не так, как вы ее пытаетесь использовать, см. ссылку выше - delete - одна из тех функций языка, которые мало кто на самом деле понимает), не более того. Реализация очищает память для вас, но это не ваш бизнес, когда (и даже если, строго говоря, именно поэтому нельзя полагаться на финализаторы на языках GC'd, которые их предлагают). Обратите внимание:

  • Только объекты, которые могут оказаться недостижимыми (т.е. не имеют доступа к нему), могут удаляться только ко всем. То, что содержит ссылки на кого, обычно довольно очевидно, как наименее концептуально. Вам просто нужно следить за тем, чтобы иметь дело с большим количеством закрытий, поскольку они могут захватывать больше переменных, чем вы думаете. Также обратите внимание, что циклические ссылки очищаются должным образом.
  • Там есть ошибка в старых (но, к сожалению, еще используемых) версиях IE, связанных с сборкой мусора обработчиков событий JS и элементов DOM. Google (возможно, даже SO) должен иметь лучший материал в моей памяти.

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

Ответ 3

Нет - Javascript запускает GC, когда ему это нравится.

Ответ 4

Метод Delete удаляет только ссылку, а не объект. Любые другие ссылки будут оставлены в открытом ожидании сборщика мусора.

JavaScript имеет свой собственный GC, и он будет работать и очищать вещи, когда ничего больше не ссылается на них.

Я все еще думаю, что это хорошая практика для нулевых объектов. Удаление объекта также помогает GC, потому что он увидит что-то свисающее и скажет: "Я собираюсь съесть тебя, потому что ты совсем один (и теперь какой-то циничный смех)".

Вы должны посмотреть Удаление объектов в JavaScript

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

Ответ 5

Вообще говоря, управление памятью в Javascript специфично для пользователя. Основы сборщика мусора - подсчет ссылок. Таким образом, установив ссылку на нуль (используя ключевое слово delete или явное назначение), вы можете убедиться, что ссылка будет очищена, IF, у объекта нет ссылок, которые будут жить вне его. В этом случае GC уже очистит любые объекты или переменные, объем которых закончился, если вы явно не установили нулевое значение.

Есть кое-что, о чем нужно позаботиться, - круговые ссылки легко создавать в JS, особенно между элементом DOM и объектом. Необходимо проявлять осторожность, чтобы очистить (или не создавать в первую очередь) ссылки на и/или элементы DOM внутри объектов. Если вы создаете ссылку на/из ссылки, связанную с DOM, обязательно явно очищайте их, установив ссылки на нуль - как на свой объект, так и на элемент DOM. Просто установка родительского объекта в null не достаточна, если есть дочерние объекты со ссылками на/из DOM или localStorage, потому что эти ссылки будут жить, и если была какая-либо ссылка от дочернего на родителя, то родитель будет жить в память из-за этой ссылки.

Веб-страницы могут фактически утечка мусора в вашей памяти таким образом - после того, как вы переместитесь, круговые ссылки сохраняют объекты и элементы DOM в памяти до тех пор, пока вы не перезапустите браузер!

Статья на тему: http://docstore.mik.ua/orelly/webprog/jscript/ch11_03.htm и еще один подробный вид: http://blogs.msdn.com/b/ericlippert/archive/2003/09/17/53038.aspx

Ответ 6

JavaScript-память обычно обрабатывается аналогично Java - я имею в виду, что есть (или должен быть) сборщик мусора, который удаляет объект, если нет ссылок на него. Так что да, просто "обнуление" ссылки - это единственный способ "справиться" с освобождением памяти, а реальное освобождение является частью хоста JS.