2016-11-06 11 views
5

Если у меня есть следующий код:Нужно ли аннулировать примитивные значения для сбора сборщиков?

function MyClass() { 
    this.data = { 
     // lots of data 
    }; 
} 

var myClassInstace = new MyClass(); 

var myobj = { 
    num:123, 
    str:"hello", 
    theClass:myClassInstance 
}; 

Я знаю, что это абсолютно необходимо сделать:

myobj.theClass = null; 

Чтобы освободить myClassInstance и его data свойство для GC. Однако, что мне делать с myobj.num и myobj.str? Должен ли я также дать им значение null? Является ли тот факт, что они примитивны, что-то изменит в отношении GC?

+0

Вы хотите сохранить 'myobj', но все его значения не занимают память или вы хотите полностью стереть« myobjt »из памяти? – vlaz

+0

«Я знаю, что это абсолютно необходимо сделать: myobj.theClass = null;' ... »** Нет, это не так. ** –

+0

Да, я хочу полностью стереть' myobj'. И если я хочу сделать **, что **, я уверен, что нужно делать «myobj.theClass = null», если я не хочу вызывать утечки памяти. –

ответ

3

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

Все это связано с фундаментальной концепцией «сферы действия» и «Цепочной цепи». Когда элемент больше не находится в какой-либо цепочке объектов других объектов, он может быть собран. Понимание этого ясно ответит на этот вопрос, а также поможет понять замыкания, которые являются сценариями, когда элементы остаются в памяти дольше, чем вы могли ожидать.

+1

Говорить, что Javascript использует подсчет ссылок, неверен. Во-первых, JavaScript - это язык, а не реализация. Различные реализации могут использовать различные типы сбора мусора. Во-вторых, V8 по крайней мере не использует подсчет ссылок, он использует генератор коллектора с алгоритмом маркировки и развертки. http://jayconrod.com/posts/55/a-tour-of-v8-garbage-collection –

+0

@JustinBlank Обновлен мой ответ. –

+0

Прохладный. Это хороший ответ. –

0

установка на undefined (не нуль) будет работать, однако delete лучше пример delete myobj.theClass

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

+0

@ Карпак У не понял вопрос, а не ответ, –

1

Существует много «зависит от этого», начиная от того, что ваш код делает с тем, в каком браузере вы работаете. Однако, если ваш объект JIT скомпилирован, чтобы не использовать карту для своих атрибутов, номер должен быть 8-байтным двойным сохраненным встроенным внутри объекта. Отбрасывание ничего не сделает.

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

Однако настоящий вопрос заключается в том, почему вы беспокоитесь об этом. Если вы не профилировали свой код и не обнаруживали сборку мусора или утечку памяти в качестве проблемы, вам не следует пытаться оптимизировать поведение GC. В частности, если ваш объект myobj сам будет жить в течение длительного времени, вам не стоит беспокоиться об обнулении полей. GC будет собирать его, когда он выходит за рамки.