Понимание, как NodeJS управляет памятью – Garbage Collector

Как мы разрабатываем более сложные приложения, нужно понять, как наша речь работает под капотом, некоторые аспекты в конечном итоге становится необходимой. В NodeJS, более конкретно engine v8 мотор, который выполняет наши приложения имеет некоторые ограничения, не буду вдаваться в подробности каждого из них, мы подробнее остановимся лишь на одно: ограничение по памяти. По умолчанию максимальный объем памяти, выделенный вращается вокруг 700mb и 1400mb, для систем на 32-разрядных и 64-разрядных соответственно, и это может стать препятствием для некоторых приложений, и поэтому важно понять, как эта память выделяется и освобожден.

Управление Памятью

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

Есть два manerias управления памятью:

  • Руководство: Состоит из делегировать эту ответственность, чтобы развивать в себе, он отвечает за все выделения и освобождения памяти в разработке вашего приложения.
  • Авто: Состоит из использования “программы” родной, как правило, называется Garbage Collector (Сборщик Мусора), который заботится, чтобы сделать весь этот процесс и постараться максимально избежать утечек памяти.

Сборщик Мусора – Garbage Collector

Понятие “сбор мусора” – это способ управлять память приложения автоматически. Работа сборщик мусора (GC – Garbage Collector) – это восстановить в памяти, занятой объектами, не используемыми (мусора). Был разработан и впервые использован в LISP в 1959 году придумал Джон Маккарти.

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

Память, Прежде чем Сборщик Работать

Анализ диаграммы ниже, это даст видение того, как в памяти осталось, когда объекты, на которые имеются ссылки в нем (“живых”), и когда больше не имеет ссылки (“мусора”).

Памяти После того, как Коллектор Работает

После сборщик работать, воспоминания, недоступными являются deletas освобождение места в памяти.

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

Преимущества Сборщик Мусора

  • Во избежание ошибок, ссылки потеряны и амулеты.
  • Не будет пытаться освободить пространство, которое уже было выпущено, экономя обработки.
  • Будет предотвратить некоторые виды утечек памяти.

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

Общие сведения о “Куче”

Куча-это структура памяти, используется NodeJS для хранения объектов, текстов и пробки. – Это здесь, что все волшебство происходит.

Но куча будет гораздо более того: процесс выполнения NodeJS хранит всю память, в набор резидентов. Вы можете думать об этом как о большой ящик, который содержит еще несколько коробок.

Набор резидент также содержит код Javascript, реальное (то, что работает в сегменте кода), а там, где все переменные находятся.

Как V8 организует стек?

Engine V8 NodeJS делит кучи в несколько различных пространств для эффективного управления памяти:

  • Новое пространство: большинство объектов выделяется здесь. Новое пространство является небольшим, и был разработан, чтобы быть собраны быстро.
  • Пространство указатель старый: содержит большинство объектов, которые могут иметь ссылки на другие объекты. Большинство объектов будет перемещена сюда после того, как выжить в новом пространстве через определенное время.
  • Данные пространстве бывшего: содержит объекты, которые содержат только данные, умерших без указателей на другие объекты). Строки, числа и массивы перемещаются сюда после того, как выжить в новом пространстве на некоторое время.
  • Места больших объектов: содержит объекты, которые больше, чем ограничения на размер других помещений. Каждый объект получает свою собственную область памяти mmap. Большие объекты не перемещаются сборщиком мусора.
  • Ивибрация в Код: объекты кода, которые содержат инструкции JIT, размещаются здесь. Это единое пространство с памятью-это исполняемый файл (код здесь)
  • Пространство ячеек, объем ячейки недвижимости и пространство карты: Содержит Клетки, PropertyCells и Карты, соответственно. Каждое место содержит объекты, которые имеют тот же размер и ограничены в стрелки, что упрощает сбор.

Работы более подробно

В основном сборщик мусора имеет режимы работы.

Сбор Короткий – Short GC

Как мы видели ранее, V8 делит куче в два поколения. Объекты выделяются в новое пространство, что является довольно небольшой (от 1 до 8 МБ). Выделение в новое пространство очень дешево: у нас есть только указатель распределения, нажимаем, когда хотим, чтобы забронировать место для нового объекта. Когда указатель выделения приходит к концу нового пространства, выбрасывается исключение (цикл меньше мусора), который быстро удаляет любой объект, умерших от нового пространства.

Сбор Полный – Full GC

Объекты, которые сохранились в двух циклов сбора небольших мусора, передаются для “старый пространства”. Пространство бывшего-это мусор на GC в комплекте (основной цикл сбора мусора), что гораздо реже. Полный цикл GC запускается, когда определенное количество памяти в старом достигнута.

Чтобы собрать старый пространства, который может содержать несколько сотен мегабайт данных, мы использовали два алгоритма тесно связаны, Mark-sweep и Mark-compact.

Заставить Сборщик Мусора

Хотя сборщик мусора NodeJS поставляется улучшилось, и очень, в последнее время, может быть, имеет смысл принудительно сбор мусора в некоторых случаях. Но помните, что всему есть затраты на обработку для этого.

Работает в обычном режиме это невозможно, Node не позволяет нам выделять или освобождать память и не иметь доступа к сборщику мусора, если мы хотим иметь доступ к функции, которая вызывает сборщик, нам нужно запустить наше приложение с параметром:

$ node --expose-gc index.js

При запуске программы с помощью этой опции, вы получите доступв функции:

global.gc();

Чтобы сделать его более безопасным, вы можете использовать:

function forceGC()
   if (global.gc) {
      global.gc();
   } else {
      console.warn('Пример текста --expose-gc index.js`.');
   }
}

Сохранить себе или поделиться:

Add a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *