
Сегодня мы обсудим управление памятью и сборку мусора в JavaScript. Хотя в JavaScript мы не выполняем никаких операций с памятью явно, тем не менее, хорошо знать, как это работает.
В языках низкого уровня, таких как C, программистам необходимо вручную выделять и освобождать память с помощью методов malloc (), calloc (), realloc () и free ().
В языках высокого уровня, таких как Java и JavaScript, программистам не нужно явно выделять или освобождать память. Память JavaScript выделяется при создании объектов (объектов, строк и т. Д.) И автоматически освобождается, когда они больше не используются. Этот процесс называется сборкой мусора.
var a = 1; // allocates memory for a number
var b = {a: 1}; // allocates memory for an object
Когда выделенная память больше не нужна, она будет освобождена.
Утечки памяти и большинство проблем, связанных с памятью, возникают при освобождении памяти.
Сборка мусора:
Сборка мусора - это форма автоматического управления памятью. Сборщик мусора, или просто сборщик, пытается вернуть мусор или память, занятую объектами, которые больше не используются программой.
Мы рассмотрим два алгоритма, используемых для сборки мусора:
1). Сборка мусора с подсчетом ссылок.
Подсчет ссылок - это метод программирования, позволяющий сохранять количество ссылок, указателей или дескрипторов на ресурс, такой как объект, блок памяти, дисковое пространство и другие.
В алгоритмах сборки мусора счетчики ссылок могут использоваться для освобождения ненужных объектов. Если в алгоритмах подсчета ссылок нет ссылок на объект, он будет автоматически сборщиком мусора.
Этот алгоритм рассматривает нулевой ссылающийся объект как объект, который больше не используется приложением.
var object1 = { object2: { value: 2 } };
object1 = 2; // object2 now has zero reference count, hence memory will be released
Однако у этого алгоритма есть ограничения, связанные с циклами.
рассмотрим функцию ниже,
function cycleReference() {
var object1 = {};
var object2 = {};
object1.a = object2; // object1 references object2
object2.a = object1; // object2 references object1
return ‘done’;
}
В приведенной выше функции, в которой object1 ссылается на object2, а object2 ссылается на object1, и создает цикл.
Когда область видимости выходит за пределы функции, эти два объекта бесполезны. Однако сборщик мусора не может освободить память, поскольку эти двое все еще имеют ссылки друг на друга.
Это приводит к утечкам памяти в приложении.
2). Алгоритм Mark and Sweep.
Сборщик мусора использует этот алгоритм для освобождения памяти, когда объект недоступен, а не для нулевого ссылающегося объекта.
Сборщик мусора сначала найдет все глобальные объекты или корневые объекты и найдет все ссылки на эти глобальные объекты, ссылки на объект ссылки и так далее. Используя этот алгоритм, сборщик мусора идентифицирует доступные и недоступные объекты.
Все недоступные объекты будут собраны мусором.
Попробуем реализовать что-то похожее на этот алгоритм.