Есть ли способ контролировать, когда Javascript выполняет сборку мусора? Я хотел бы включить его для выполнения сбора мусора в определенные моменты времени, чтобы обеспечить бесперебойную работу моего веб-сайта.
Javascript и сбор мусора
Ответ 1
Сбор мусора в справочнике javascript
Javascript не имеет явной памяти mangament, это браузер, который решает, когда его очистить. Иногда может случиться, что вы испытываете негладкое отображение JavaScript из-за паузы сбора мусора.
Существует множество методов, которые можно применять для устранения сбоев, вызванных сбором мусора (GC). Больше вы применяете больше исследований. Предположим, что у вас есть игра, написанная на JavaScript, и каждую секунду вы создаете новый объект, тогда очевидно, что через некоторое время GC появится, чтобы сделать дополнительное пространство для вашего приложения.
Для приложений реального времени, таких как игры, для которых требуется много места, простейшая вещь, которую вы можете сделать, это повторное использование одной и той же памяти. Это зависит от вас, как вы структурируете свой код. Если он генерирует много мусора, то это может привести к прерывистому опыту.
Используя простые процедуры: Хорошо известно, что новое ключевое слово указывает на выделение. По возможности вы можете попытаться повторно использовать один и тот же объект каждый раз, добавив или изменив свойства. Это также называется утилизация объекта
В случае массивов присвоение [] часто используется для очистки массива, но вы должны иметь в виду, что он также создает новый массив и мусор старого. Чтобы повторно использовать один и тот же блок, вы должны использовать arr.length = 0
. Это имеет тот же эффект, но он повторно использует один и тот же объект массива вместо создания нового.
В случае функций: Иногда нашей программе нужно было вызывать определенную функцию больше времени или через определенные интервалы с помощью setInterval или setTimeout.
ex: setTimeout(function() { doSomething() }, 10);
Вы можете оптимизировать вышеуказанный код, назначая функцию постоянной переменной, а не размножаясь каждый раз с регулярными интервалами.
ex : var myfunc = function() { doSomething() }
setTimeout(myfunc, 10);
Другая возможная вещь заключается в том, что метод slice() массива возвращает новый массив (на основе диапазона в исходном массиве, который может оставаться нетронутым), string substr также возвращает новую строку (в зависимости от диапазона символов в исходная строка, которая может оставаться нетронутой) и т.д. Вызов этих функций создает мусор, если его не использовать повторно.
Чтобы избежать мусора полностью в JavaScript, очень сложно, вы могли бы сказать, что это невозможно. Это зависит от того, как вы повторно используете объекты и переменные, чтобы избежать мусора. Если ваш код хорошо структурирован и оптимизирован, вы можете свести к минимуму накладные расходы.
Ответ 2
К сожалению, нет способа контролировать КОГДА сбор мусора имеет место, но при правильном образовании объектов вы МОЖЕТЕ контролировать, как быстро и чисто это происходит. Взгляните на эти документы в Mozilla Dev Net.
Этот алгоритм предполагает знание набора объектов, называемых корнями (В JavaScript корень - это глобальный объект). Периодически сборщик мусора начнет с этих корней, найдет все объекты, которые ссылаются на эти корни, тогда все объекты, на которые ссылаются эти и т.д. Исходя из корней, сборщик мусора будет таким образом найти все доступные объекты и собрать все недосягаемые объекты.
Этот алгоритм лучше предыдущего, поскольку "объект имеет нулевая ссылка" приводит к недостижимости этого объекта. не так, как мы видели с циклами.
Ответ 3
Почему бы не сохранить ссылки на все ваши объекты, пока вы не захотите, чтобы они были 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;
}
Ответ 4
вы можете выполнить некоторые изменения, чтобы улучшить использование вашей памяти, например:
- не устанавливать переменные в циклы
- избегать использования глобальных переменных и функций. они возьмут кусочек памяти, пока не выйдете.
Ответ 5
JavaScript - это собранный мусором язык, что означает, что среда выполнения отвечает за управление памятью, требуемой во время выполнения кода. Самая популярная форма сборки мусора для JavaScript называется mark-and-sweep. Второй, менее популярный тип сбора мусора - подсчет ссылок. Идея состоит в том, что каждое значение отслеживает, сколько ссылок делается на него
GC следует за этим алгоритмом, даже если вам удастся запустить GC, не будет гарантировано, что он запустится немедленно, вы только отметите его
Ответ 6
сбор мусора (GC) - это форма автоматического управления памятью, удаляя ненужные объекты.
любая сделка с памятью выполняется следующим образом:
1 - выделите требуемое пространство памяти
2 - выполните некоторую обработку
3 - освободите это пространство памяти
существует два основных алгоритма, используемых для определения того, какие объекты больше не нужны.
Ссылка на подсчет сборок мусора: этот алгоритм уменьшает определение "объект больше не нужен", чтобы "объект не имел другого объекта, ссылающегося на него", объект будет удален, если нет ссылки на него
Алгоритм Mark-and-sweep: подключите каждый объект к корневому источнику. любой объект не подключается к корневому или другому объекту. этот объект будет удален.
в настоящее время большинство современных браузеров используют второй алгоритм.