четверг, 26 мая 2022 г.

Время жизни объекта в .NET Framework

 

 
  •  

Время жизни объекта — это время, когда блок памяти выделяется этому объекту во время некоторого процесса выполнения, и этот блок памяти освобождается, когда процесс завершается. Как только объекту выделяется память, необходимо освободить эту память, чтобы она использовалась для дальнейшей обработки, иначе это приведет к утечке памяти. 

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

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

Этот экземпляр является объектом этого типа класса. Блок памяти выделяется, когда ключевое слово new используется для создания экземпляра нового объекта и вызывается конструктор. 

Этот блок памяти достаточно велик, чтобы вместить объект.

Когда мы объявляем переменную класса, она размещается в стеке, и когда она достигает нового ключевого слова, она размещается в куче . 

Другими словами, когда создается объект класса, он размещается в куче с помощью оператора ключевого слова C# new . 

Однако новое ключевое слово возвращает ссылку на объект в куче, а не на сам объект. 

Эта ссылочная переменная сохраняется в стеке для дальнейшего использования в приложениях.
 
программа
 
Когда для создания объекта используется оператор new, память для этого объекта берется из управляемой кучи, а управляемая куча представляет собой нечто большее, чем просто случайный фрагмент памяти, к которому CLR обращается. Когда объект больше не используется, он удаляется из памяти, чтобы эту память можно было использовать повторно.
 
Ключевым элементом .NET Framework является автоматическая сборка мусора, которая управляет памятью для всех приложений .NET.

Когда объект создается, сборщик мусора уничтожит объект, когда он больше не нужен. Явного освобождения памяти не происходит, поскольку сборщик мусора отслеживает неиспользуемые объекты и выполняет сбор для освобождения памяти, что является автоматическим процессом. 

Сборщик мусора удаляет объекты из кучи, когда они недоступны какой-либо части вашей кодовой базы. 

Сборщик мусора .Net сжимает пустые блоки памяти с целью оптимизации.
 
Куча подразделяется на три поколения, поэтому она может обрабатывать долгоживущие и короткоживущие объекты. 

Сборка мусора в основном происходит при утилизации недолговечных объектов, которые обычно занимают лишь небольшую часть кучи.
 
Поколения
 
В куче есть следующие три поколения объектов:
  • Поколение 0: вновь созданные объекты относятся к поколению 0. Эти объекты в поколении 0 собираются часто, чтобы обеспечить быстрый сбор недолговечных объектов и освобождение памяти. Объекты, пережившие поколение 0, коллекции переводятся в поколение 1. Большинство объектов утилизируются для сборки мусора в поколении 0 и не сохраняются в следующем поколении.
     
  • Поколение 1: Объекты, которые собираются реже, чем Поколение 0, и содержат объекты с более длительным сроком жизни, которые были повышены из Поколения 0. Объекты, пережившие Поколение 1, коллекции переводятся в Поколение 2.
     
  • Поколение 2: Объекты, продвинутые из Поколения 1, которые являются наиболее долгоживущими объектами и собираются нечасто. Общая стратегия сборщика мусора состоит в том, чтобы реже собирать и перемещать долгоживущие объекты.
Сборщик мусора автоматически очищает управляемые ресурсы , так как управляемый код непосредственно нацелен на среду CLR. 

Но когда объект использует неуправляемые ресурсы , такие как соединения с базой данных или манипулирование файлами, их необходимо освобождать вручную, и это можно сделать с помощью метода finalize.
 
Мы используем метод деструктора, используя знак (~) в нашем коде для уничтожения объектов, и этот деструктор преобразуется в метод финализации (проверьте скомпилированный код). 

Это известно как процесс финализации. 

Если мы реализуем Finalize(), у нас нет контроля, поскольку, когда этот метод должен быть вызван, сборщик мусора позаботится об этом сам. 

В процессе финализации есть два цикла сбора, чтобы полностью освободить память объекта. 

Во время первого прохода сбора объект помечается для финализации. После финализации сборщик мусора может освободить память объекта, и эта память будет освобождена.
 
Существует еще один метод Dispose(), который явно освобождает управляемые и неуправляемые ресурсы. 

Этот метод является единственным методом в интерфейсе IDisposable и может использоваться для освобождения неуправляемых ресурсов вручную.
 
Я написал еще одну статью о шаблоне IDisposable, в которой у нас будет четкое представление о разнице между Finalize() и Dispose().

Комментариев нет:

Отправить комментарий

Паттерн 'Репозиторий' в ASP.NET

  Последнее обновление: 1.11.2015         Одним из наиболее часто используемых паттернов при работе с данными является паттерн 'Репозито...