2013-09-14 5 views
37

Есть ли способ контролировать, когда Javascript выполняет сборку мусора? Я хотел бы включить его для выполнения сбора мусора в определенные моменты времени, чтобы обеспечить бесперебойную работу моего веб-сайта.Javascript и сбор мусора

+1

Одним словом: нет. Это не проблема для многих сайтов. Может быть, вы могли бы более подробно объяснить, что проблема с вашей? –

+5

[Написание быстрого, эффективного для работы с памятью JavaScript] (http://coding.smashingmagazine.com/2012/11/05/writing-fast-memory-efficient-javascript/), [Управление памятью] (https: // разработчик. mozilla.org/en-US/docs/Web/JavaScript/Memory_Management) – Itay

+3

[Высокопроизводительный, мусорно-коллективный код] (http://buildnewgames.com/garbage-collector-friendly-code/) – raina77ow

ответ

71

Javascript не имеет явного управления памятью, это браузер, который решает, когда его очистить. Иногда может случиться, что вы испытываете негладкое отображение JavaScript из-за паузы сбора мусора.

Существует множество методов, которые можно применять для преодоления сбоев, вызванных сбором мусора (GC). Больше вы применяете больше исследований. Предположим, у вас есть игра, написанная на JavaScript, и каждую секунду вы создаете новый объект, тогда очевидно, что через некоторое время GC появится, чтобы сделать дополнительное пространство для вашего приложения.

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

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

В случае Массивы, назначая [часто используется для очистки массива], но вы должны иметь в виду, что это также создает новый массив и garbages старый. Чтобы повторно использовать один и тот же блок, вы должны использовать arr.length = 0. Тот же эффект, но он повторяет один и тот же объект массива вместо создания нового.

В случае функций: Иногда нашей программе необходимо было вызвать определенную функцию больше времени или через определенные интервалы с помощью setInterval или setTimeout.

ex: setTimeout(function() { doSomething() }, 10); 

Вы можете оптимизировать код выше, присвоив функцию к постоянной переменной, а не порождая каждый раз через равные промежутки времени.

ex : var myfunc = function() { doSomething() } 
    setTimeout(myfunc, 10); 

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

Во избежание полного удаления мусора в JavaScript очень сложно, вы могли бы сказать, что это невозможно. Это зависит от того, как вы повторно используете объекты и переменные, чтобы избежать мусора. Если ваш код хорошо структурирован и оптимизирован, вы можете минимизировать накладные расходы.

+0

Если вы собираетесь это сделать, может быть, лучше написать игру на C++ и скомпилировать ее в asm.js через Emscripten? Нет GC, чтобы беспокоиться о :) – Demi

5

К сожалению, нет способа контролировать КОГДА сбор мусора имеет место, но при правильном образовании объектов вы МОЖЕТЕ контролировать, как быстро и чисто это происходит. Взгляните на these documents on Mozilla Dev Net.

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

Этот алгоритм лучше предыдущего, поскольку «объект имеет нулевую ссылку» приводит к недостижимости этого объекта. Противоположность неверна, как мы видели с циклами.

2

Почему бы не сохранить ссылки на все ваши объекты, пока вы не захотите, чтобы они были GC'd?

var delayed_gc_objects = []; 
function delayGC(obj) { // keeps reference alive 
    return delayed_gc_objects[delayed_gc_objects.length] = obj; 
} 
function resumeGC() { // kills references, letting them be GCd 
    delayed_gc_objects.length = 0; 
} 
+10

Это только задерживает рекультивацию (проверку), а не проверку на доступность (трассировка), не говоря уже о сборке мусора в целом. Другими словами, это только делает время отходов GC. – delnan

0

вы можете выполнить некоторые изменения, чтобы улучшить ваше использование памяти, как:

  1. не установить переменные на петлях
  2. избегать использования глобальных переменных и функций. они заберут кусочек памяти, пока не выйдут
0

JavaScript - это язык, собранный с помощью мусора, что означает, что среда выполнения отвечает за управление памятью, требуемой во время выполнения кода. Самая популярная форма сборки мусора для JavaScript называется mark-and-sweep. Второй, менее популярный тип сбора мусора - это подсчет ссылок. Идея состоит в том, что каждое значение отслеживает, сколько ссылок делается на него

GC следует за этим алгоритмом, даже если вам удастся запустить GC, не будет гарантировано, что он будет запущен немедленно, вы только отмечаете его

+0

Поскольку нет финализации, не удалены ли те, которые не отмечены? – Pacerier

-3

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

любая сделка процесс с памятью выполните следующие действия:

1 - выделить ваше пространство памяти вам нужно

2 - сделать некоторые обработки

3 - освободить это пространство памяти

Есть два основных алгоритма, используемых для определения того, какие объекты больше не нужны.

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

Алгоритм пометки и разметки: свяжите каждый объект с корневым источником. любой объект не подключается к корневому или другому объекту. этот объект будет удален.

В настоящее время наиболее современные браузеры используют второй алгоритм.

+1

Я знаю, какая сборка мусора. Вопрос в том, как контролировать, когда это происходит. –

Смежные вопросы