Garbage Collector

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

public class User{

public string Name{get; set;} static void Main(string[] args){

User us new User();
us.Name "text";

2. Инициализировать выделенную память, установив начальное состояние ресурсов.
3. Использовать ресурс, обращаясь к членам его типа.
4. Ликвидировать ресурс.
5. Освободить память.

Garbage collector полностью освобождает разработчика от необходимости следить за использованием и своевременным
освобождением памяти. Требует выделять память из управляемых куч.
После получения команды new User среда Сll 1. Подсчитывает кол-во байт, необходимых для размещения полей типа.
2. Прибавляет к полученному значению, кол-во байт необходимых для размещения системных полей объекта.
3. Если в управляемой куче достаточно места для объекта, ему выделяется память начиная с адреса, на который указывает наш указатель, а заменяемые им байты, обнуляются.
4. Вызывается конструктор типа и команда New возвращает адрес объекта и перемещается наш указатель.

Специально для моих подписчиков. В наше время частая проблема — поломка экрана. Многие входят в заблуждение, что на этом с телефоном надо расстаться, продать его на запчасти и начинать собирать на новый. Ошибочно! В наше время починка экрана телефона не такая сложная и дорогая услуга. Достаточно найти мастера и экран вашего телефона. Как раз на счет экрана, вы легко сможете найти его на новом сайте, просмотритевсе отзывы на mobilife.com.ua.

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

1. Маркировка проходит по стеку потока и определяет неиспользуемые объекты. Проверяет все корни, маркируя объекты.
Встретив уже маркированный объект, сборщик мусора останавливается и переходит к следующему этапу сборки этап сжатия.
2. Сжатие линейно проходит по куче в поиске не маркированных объектов, как только он находит не маркированные
большие объекты, он смещает их в отдельную память.
DotNet поддерживает 3 поколения 0,1,2.

Рождаясь, объекты попадают в нулевое поколения.
Каждый раз как объект переживает сборку мусора, он попадает в следующие поколение в класс GC.
GC класс для управления сборкой мусора. Позволяет получать информацию о поколениях, а так же принудительно иницировать сбор мусора, кроме того позволяет отменять работу деструктора.

public class User{

public string Name{get; set;}

~User(){ static void Main(string[] args){

Console.WriteLine(GC.GetTotalMemory(false));
Console.ReadLine();


Поколения 0 объекты не проверялись сборщиком мусора.
Поколение 1 объекты пережили одну проверку сборщика мусора.
Поколение 2 объекты, которые пережили больше чем одну сборку мусора.


GC.GetTotalMemory(false) возвращает размер памяти в байтах, которую занимает объекты в управляемых кучах.
Он принимает параметр указывающий запускать или нет сборку мусора.
GC.MaxGeneration возвращает максимальное кол-во поколений поддерживаемое данной системой.
Gc.GetGeneration(объект) принимает объект и возвращает поколение, к которому относится данный объект.
Gc.Collect(2) дает указание сборщику мусора проверить объекты определенного поколения.
Gc.WaitForPendingFinalizers приостанавливает выполнение текущего потока, пока не будут отобраны все объекты
предусматривающие финализацию. Финализацией называется поддерживаемый Cll механизм, позволяющий объекту
выполнить корректную очистку прежде чем сборщик мусора освободит занятую им память.
Любой тип выполняющий функциюоболочки машинного ресурса, например файла сетевого соединения, сокета, мютекса должен поддерживать финализацию. Для этого в типе реализуют метод финализации.
Определив, что объект стал мусором, сборщик вызывает метод финализации объекта, его невозможно вызвать самостоятельно. Рекомендуется для очистки неуправляемых ресурсов, переопределение осуществляется путем создания
специального метода в теле класса.

Gc.CoolectionCount() возвращает числовое значение, сколько раз данная генерация (поколения) выжила при сборке
мусора.

using(){} используется для создания блока кода для объектов гарантировано будет вызван метод Dispose.
Объекты, которые создаются в блоке using, обязаны реализовать интерфейс IDisposable.
  • avatar
  • 0
  • 0