Skip to content

Latest commit

 

History

History
88 lines (77 loc) · 4.98 KB

Dev VS Garbage Collector.md

File metadata and controls

88 lines (77 loc) · 4.98 KB

Garbage Collector

  1. Джон Шарп. MS Visual C# Глава 14 - Использование сборщика мусора и управление ресурсами https://msdn.microsoft.com/en-us/library/system.gc(v=vs.110).aspx

Стек - содержит типы значений. Куча - содержит ссылочные типы. CLR (Common Language Runtime) - общеязыковая среда выполнения. Garbage Collector - Сборщик мусора - процесс уничтожения объекта и возвращения памяти в кучу. Деструктор - специальный метод, вызывается CLR при высвобождении объекта. Объект може быть уничтожен, но его память станет доступна только, когда исчезнут все ссылки на него.

Создание объекта (new) Паттерны проектирования на платформе .NET.pdf

  1. Неконтролируемый этап. Операция new выделяет участок динамической памяти (куче).
  2. Котролируемый этап. Преобразует участок памяти в объект, который нужно инициализировать. 2.1. Конструирование объекта по указанному адресу (вызов конструктора). 2.2. Инициализация полей.

Уничтожение объекта (Dispose)

  1. Котролируемый этап. CLR наводит порядок. Деструктор.
  2. Некотролируемый этап. Освободить память объекта в куче.

Сборщик мусора гарантирует:

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

System.GC.Collect() - ручной запуск сборщика мусора. Выполняется асинхронно. Следует исключать взаимозависимость деструкторов. Не следует иметь два деструктора, пытающихся высвободить одни и теже ресурсы.

Unmanaged resources (Неуправляемые ресурсы)

  • Открытые файлы, дескрипторы файлов
  • Открытые сетевые подключения, подключение к БД
  • Неуправляемая память
  • В XNA: буферы вершин, буферы индексов, текстуры и т.д. / In XNA: vertex buffers, index buffers, textures, etc. Метод высвобождения ресурсов - Disposal method. System.IO.TextReader.Close() - пример метода высвобождения ресурсов. -> StreamReader / StringReader

Инструкция using позволяет точно управлять сроком жизни объекта. using (type variable = initialization) { StatementBlock }

using (TextReader reader = new StreamReader(filename)) { string line; while ((line = reader.ReadLine()) != null) { Console.WriteLine(line); } } Инструкция using является точным эквивалентом следующего преобразования: { TextReader reader = new StreamReader(filename); try { string line; while ((line = reader.ReadLine()) != null) { Console.WriteLine(line); } } finally { if (reader != null) { ((IDisposable)reader).Dispose(); } } }

Метод Dispose предназначен для высвобождения всех используемых объектом ресурсов. Можно забыть вызвать метод Dispose, но в конце программы он всё равно будет вызван. System.GC.SuppressFinalize(this) - Метод не позволяет сборщику мусора вызвать деструктор Можно пользоваться, только когда точно знаешь, что объект уничтожен. lock (this) - позволяет исключить возможность одновременного высвобождения ресурсов. Инструкция lock предназначена для предотвращения запуска одного и тогоже блока кода, одновременно в разных потоках.