2015-05-14 2 views
1

Рассмотрите приведенный ниже код JavaScript. Я создаю массив, скажем, 4 элемента, а затем сразу удалю ссылку на него. Когда произойдет сбор мусора? Я знаю, что это специфично для языковой реализации, но у нас не так много движков JavaScript.Как происходит сбор мусора в JavaScript?

Редактировать: Это самый простой возможный случай, но он меня интересует, потому что сбор мусора вызывает слышимые сбои в некоторых приложениях для веб-аудио.

var a = [1, 2, 3, 4]; 
a = null; 
// other code 

Update: Javascript and Garbage collection не объясняет последовательность событий и как это срабатывает. Я не хочу контролировать сбор мусора. Мне нужно лучшее понимание для разработки лучшего кода.

+1

Ответ: http://stackoverflow.com/questions/18800440/javascript-and-garbage-collection –

+1

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management – saruftw

+0

Спасибо, я кое-что прочитал. Я уточню свой вопрос, когда получу понимание. –

ответ

1

Есть много способов ШС могут быть вызваны

  • распределение-инициирующего: нет больше места в буферы распределения/молодые поколения/howeveritiscalled и GC требуется, чтобы освободить объекты
    Это получает немного более сложной в смешанной среде GC/ручного распределения. Оболочкам malloc может потребоваться также запуск GCs, поскольку javascript может удерживать ресурсы, выделенные вручную.
  • [в браузерах], когда вкладка/окно закрывается/заменяется на предположении, что существует много простых в собирать мусор в тот момент
  • время запускается эвристиками для дополнительных коллекций для удовлетворения паузы целей времени
  • привилегированный javascript может запускать коллекции напрямую
  • как последнее усилие от различных компонентов, не связанных с GC, если у них заканчиваются собственные ресурсы (дескрипторы файлов, виртуальное адресное пространство) в надежде, что объекты GC, ожидающие завершения держались на них

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

Если вы хотите, чтобы GCs были низкими, вам необходимо поддерживать низкий уровень распределения объектов. Например. некоторые алгоритмы могут извлечь выгоду из предварительно выделенных буферов, на которых они выполняют свою работу. Эффективность этой стратегии зависит от того, имеет ли время выполнения javascript анализ с помощью escape-анализа и насколько эффективно он избегает краткосрочных распределений в первую очередь. И о том, коллекционер является поколением. Коллективный коллекционер страдает намного меньше от быстрых краткосрочных ассигнований.

1

Это хороший подход для удаления ссылок на объекты, которые больше не используются. Многие (почти все) javascript-двигатели используют Mark and Sweep. Если вы удаляете ссылку на объект и у нее нет других ссылок, она, вероятно, будет собрана в следующем меток и цикла развертки.

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

+0

«доступной документации нет» Несколько основных двигателей JS мирового класса - с открытым исходным кодом. –