9 ответов:
Эрик Липперт написал подробный пост в блоге об этом предмете некоторое время назад (кроме того, сравнивая его с VBScript). Точнее, он писал о JScript, который является собственной реализацией Microsoft ECMAScript, хотя и очень похож на JavaScript. Я бы предположил, что вы можете предположить, что подавляющее большинство поведения будет одинаковым для JavaScript-движка Internet Explorer. Конечно, реализация будет варьироваться от браузера к браузеру, хотя я подозреваю, что вы можете взять ряд общих принципов и применить их к другим браузерам.
цитата с этой страницы:
JScript использует nongenerational сборщик мусора Марк-и-стреловидности. Оно работает так:
каждая переменная, которая "в области" называется "мусорщик". Мусорщик может относиться к числу, объекту, а струна, что угодно. Мы ведем список из мусорщики -- переменные перемещаются в список мусорщиков, когда они придут в область видимости и из списка scav, когда они выходят за рамки видимости.
время от времени мусор коллектор работает. Сначала он ставит "отметка" на каждом объекте, переменная, строка и т. д.-Вся отслеживаемая память ГК. (JScript использует вариант структура данных внутри и там много ли дополнительных неиспользуемых битов в эта структура, поэтому мы просто установили один из их.)
во-вторых, он очищает метку на мусорщики и транзитивное замыкание из ссылок мусорщика. Так что если объект scavenger ссылается на a объект nonscavenger затем мы очищаем биты на nonscavenger, и дальше все, к чему это относится. (Я есть использование слова "закрытие" в a другой смысл, чем в моем предыдущем должность.)
на данный момент мы знаем, что все выделена память, все еще отмеченная памяти, которая не может быть достигнута никакими путь от любой переменной в области. Все этих объектов поручено сорвите себя вниз, что разрушает любые циклические ссылки.
основная цель сборки мусора-позволить программисту не чтобы беспокоиться об управлении памятью объектов, которые они создают и используют, хотя, конечно, иногда этого не избежать - всегда полезно иметь хотя бы приблизительное представление о том, как собирать мусор завод.
есть несколько конкретных моментов, о которых нужно знать. На сайте разработчика Apple есть некоторые директивы по этому вопросу. Два важных оттуда:
- использование инструкции delete. Всякий раз, когда вы создаете объект с помощью нового оператора, соедините его с оператором delete. Это гарантирует, что вся память, связанная с объектом, включая его имя свойства, доступна для сборки мусора. Инструкция delete подробнее об этом читайте в материале "освобождение объектов."
- используйте ключевое слово var. Любая переменная, созданная без ключевого слова var, создается в глобальной области и никогда не подходит для сборки мусора, что дает возможность утечки памяти.
Я бы предположил, что практика должна применяться ко всем движкам JavaScript (в разных браузерах), хотя, поскольку это с сайта Apple, они мая будьте несколько специфичны для Safari. (Возможно, кто-то мог бы прояснить это?)
надеюсь, что это поможет.
остерегайтесь циклических ссылок, когда задействованы объекты DOM:
шаблоны утечки памяти в JavaScript
имейте в виду, что память может быть восстановлена только тогда, когда нет активных ссылок на объект. Это общая ловушка с закрытиями и обработчиками событий, так как некоторые JS-движки не будут проверять, какие переменные на самом деле ссылаются во внутренних функциях, и просто сохраняют все локальные переменные входящих функций.
здесь простой пример:
function init() { var bigString = new Array(1000).join('xxx'); var foo = document.getElementById('foo'); foo.onclick = function() { // this might create a closure over `bigString`, // even if `bigString` isn't referenced anywhere! }; }наивная реализация JS не может забрать
bigStringпока есть обработчик событий. Есть несколько способов решить эту проблему, например установкаbigString = nullв концеinit()(deleteне работает для локальных переменных и аргументов функции:deleteудаляет свойства из объектов, а переменный объект недоступен-ES5 в строгом режиме даже броситReferenceErrorпри попытке удалить локальную переменную!).Я рекомендую избегать ненужные закрытие как можно больше, если вы заботитесь о потреблении памяти.
хорошая цитата взята из блога
компонент DOM является "собранным мусором", как и компонент JScript, что означает, что если вы создадите объект в любом компоненте, а затем потеряете этот объект, он в конечном итоге будет очищен.
например:
function makeABigObject() { var bigArray = new Array(20000); }при вызове этой функции компонент JScript создает объект (с именем bigArray), доступный внутри функции. Однако, как только функция возвращается, вы " теряете трек " bigArray, потому что больше нет возможности ссылаться на него. Ну, компонент JScript понимает, что вы потеряли его след, и поэтому bigArray очищается-его память восстанавливается. То же самое работает в компоненте DOM. Если вы скажете
document.createElement('div'), или что-то подобное, то компонент DOM создает объект для вас. Как только вы каким-то образом потеряете этот объект, компонент DOM очистит связанный.
насколько мне известно, объекты JavaScript периодически собираются в мусор, когда на объект не остается ссылок. Это то, что происходит автоматически, но если вы хотите увидеть больше о том, как это работает, на уровне C++, имеет смысл взглянуть на WebKit или исходный код V8
обычно вам не нужно думать об этом, однако, в старых браузерах, таких как IE 5.5 и ранние версии IE 6, и, возможно, текущие версии, замыкания будут создавать циклические ссылки, которые при снятии флажка будут в конечном итоге съедать память. В частном случае, который я имею в виду о закрытиях, это было, когда вы добавили ссылку JavaScript на объект dom и объект к объекту DOM, который ссылается на объект JavaScript. В основном он никогда не может быть собран и в конечном итоге приведет к тому, что ОС станет нестабильной в тестовых приложениях, которые зацикливаются на создании сбоев. На практике эти утечки, как правило, небольшие, но, чтобы сохранить ваш чистый код, вы должны удалить код JavaScript ссылка на объект дом.
обычно рекомендуется использовать ключевое слово delete для немедленного удаления ссылок на большие объекты, такие как данные JSON, которые вы получили обратно и сделали все, что вам нужно сделать с ним, особенно в мобильной веб-разработке. Это заставляет следующую развертку GC удалить этот объект и освободить его память.
сбор мусора (GC) - это форма автоматического управления памятью путем удаления объектов, которые больше не нужны.
любой процесс работы с памятью выполните следующие действия:
1-выделите место в памяти вам нужно
2 - сделать какую-то обработку
3-освободите это пространство памяти
существует два основных алгоритма, используемых для определения того, какие объекты больше не нужны.
сбор мусора для подсчета ссылок: этот алгоритм уменьшает определение "объект больше не нужен" до "у объекта нет другого объекта, ссылающегося на него", объект будет удален, если нет точки отсчета к нему
алгоритм разметки и развертки: подключение каждого объекта к корневому источнику. любой объект не подключается к root или другой объект. этот объект будет удален.
в настоящее время большинство современных браузеров используя второй алгоритм.
" в информатике сбор мусора (GC) является формой автоматического управления памятью. Сборщик мусора или просто сборщик пытается восстановить мусор или память, используемые объектами, которые никогда не будут доступны или мутированы снова приложением."
все движки JavaScript имеют свои собственные сборщики мусора, и они могут отличаться. В большинстве случаев вам не придется иметь дело с ними, потому что они просто делают то, что они должны делать.
написание лучший код в основном зависит от того, насколько хорошо вы знаете принципы программирования, язык и конкретную реализацию.
что такое сборка мусора JavaScript?
Регистрация этой
что важно для веб-программиста, чтобы понять о сборке мусора JavaScript, для того, чтобы написать лучший код?
в Javascript вы не заботитесь о выделении и освобождении памяти. Вся проблема требует, чтобы интерпретатор JavaScript. Утечки все еще возможны в Javascript, но они являются ошибками переводчик. Если вы заинтересованы в этой теме, вы можете прочитать больше в www.memorymanagement.org
в windows вы можете использовать потека.exe чтобы найти утечки памяти или проверить, работает ли ваша бесплатная процедура mem.
Это очень просто, просто введите URL-адрес веб-сайта, и вы увидите потребление памяти встроенного рендерера IE. Затем нажмите Обновить, если память увеличивается, вы нашли утечку памяти где-то на веб-странице. Но это также очень полезно, чтобы увидеть, если процедуры для освобождения памяти работают для IE.
ссылка типа не храните объект непосредственно в переменной to который он назначен, поэтому объектная переменная в этом примере фактически не имеет содержать экземпляр объекта. Вместо этого он содержит указатель (или ссылку) на место в памяти, где объект существует
var object = new Object();Если вы назначаете одну переменную другой, каждая переменная возвращает копию указателя, и оба по-прежнему ссылаются на один и тот же объект в память.
var object1 = new Object(); var object2 = object1;JavaScript-это мусор язык, так что вам действительно не нужно беспокоиться о выделении памяти при использовании ссылочных типов. Однако, это лучше всего разыменования объекты, которые вам больше не нужны, так что фигня коллектор может освободить эту память. Лучший способ сделать это-установить объектная переменная имеет значение null.
var object1 = new Object(); // do something object1 = null; // dereferenceразыменование объекты особенно важны в очень больших приложениях, которые используют миллионы объектов.
из принципов объектно-ориентированного JavaScript-NICHOLAS C. ZAKAS

Comments