garbage collector
TRANSCRIPT
ТРЕНИНГ НА ТЕМУ:GARBAGE COLLECTOR
Парадигмы программированияОсновные источники ошибок программирования:• забыть освободить память, ставшую ненужной• пытаться использовать уже освобожденную память
Нельзя предсказать ни последствий этих ошибок, ни периодичность их появления.
Они ведут к:• утечке ресурсов (увеличивая потребление памяти)• повреждению объектов (дестабилизируя систему)
РешениеСборка мусора (garbage collection) полностью освобождает разработчика от необходимости следить за использованием и своевременным освобождением памяти.
Ресурсы выделяются из управляемой кучи:• IL-команда newobj (оператор new ) создает объект• указатель NextObjPtr определяет, где в куче будет выделена
память для следующего объекта.
Если свободного адресного пространства недостаточно:• Куча добавляет байты, необходимые для объекта, к адресу,
заданному указателем NextObjPtr• Если результирующее значение выходит за пределы адресного
пространства, происходит сборка мусора.
Алгоритм сборки мусора
Минусы:Сборка мусора бьет по производительности.
Плюсы:Исключается утечка объектов.Невозможно получить доступ к освобожденному объекту.Управляемые объекты не фрагментируют виртуальное адресное пространство процесса.
У каждого приложения есть набор корней (roots). Корень - адрес указателя на объект ссылочного типа. Корни: статические поля, параметры методов, локальные переменные, регистры процессора.
Первый шаг. Маркировка. Вычисляется граф живых объектов.
Второй шаг. Сжатие. Производится уплотнение кучи.
Устройство объектаenum_flag_ContainsPointers (0x40000)enum_flag_large_Object (0x20000)enum_flag_HasFinalizer (0x100000)
Поколения• Поколения - это механизм сборщика мусора в CLR,
единственным назначением которого является повышение производительности приложения.
• CG.NET поддерживает три поколения: 0, 1 и 2
Алгоритм CG в Small Object Heap
Алгоритм CG в Large Object Heap
From To425000 16777216
Free Space Table
From To658000 16777216
94208 182272
From To425000 16777216
94208 182272
System.GC• System.GC – класс для
управления сбором мусора.
• Позволяет получать информацию о поколениях, а также принудительно инициировать сбор мусора.
• Позволяет отменить работу деструктора объекта.
Механизм финализацииФинализацией (finalization) называется механизм, который позволяет объекту выполнить корректную очистку, прежде чем сборщик мусора освободит занятую им память.
Мотивы вызова методов финализации:• Заполнение поколения О приводит к запуску сборщика
мусора.• Явный вызов статического метода Collect объекта
System.GC.• Windows сообщает о нехватке памяти.• Выгрузка средой CLR домена приложения.• Закрытие CLR.
Определение метода финализации
Механизм финализации
Особенности использования финазицации
• Методы Finalize оказывают заметное влияние на производительность, потому реализовывать его необходимо только в объектах, требующих завершения.
• Время исполнения финализаторов не может быть определено заранее.
• Следует избегать написание методов Finalize, обращающихся к другим объектам, типы которых определяют метод Finalize.
IDisposable• Интерфейс IDisposable
включает в себя единственный метод - void Dispose().
Назначение интерфейса IDisposable – класс сможет освобождать неуправляемые ресурсы тогда, когда это необходимо разработчику.
IDisposable• При работе с типами .NET, которые поддерживают
интерфейс IDisposable, синтаксическая конструкция using будет гарантировать автоматический вызов метода Dispose() в отношении соответствующего объекта при выходе из блока using.
• Некоторые классы переименовывают Dispose() в Close().
Советы по использованию метода Dispose()
• При вызове метода Dispose() стоит проинформировать сборщик мусора о пропуске финализации, вызвав метод GC.SuppressFinalize().
• Следует разрешить многократный вызов метода Dispose() без генерации исключений.
• Даже при наличии явного управления с помощью метода Dispose следует предоставить и неявное освобождение ресурсов с использованием метода Finalize.
Паттерн Dispose
• Формализованный шаблон освобождения ресурсов Microsoft, который позволяет достичь оптимального баланса между надежностью, удобством в обслуживании и производительностью.
• Используйте формализованный шаблон очистки для того, чтобы обеспечить корректную работу как финализатора, так и Dispose().
Паттерн Dispose
Finalize() vs. Dispose()
Finalize() рекомендуется добавлять в код класса для освобождения неуправляемых ресурсов.
Dispose() рекомендуется применять для освобождения неуправляемых ресурсов тогда, когда это необходимо разработчику.
Finalize() вызывается, когда сборщик мусора решит уничтожить объект.
Метод Dispose() должен вручную вызываться пользователем этого объекта.
Метода Finalize(), допускается переопределять только в классах.
Интерфейс IDisposable может быть реализован как в классах, так и в структурах.
Режимы сборки мусора
• Режим рабочей станции – настраивает сборку мусора для приложений на стороне клиента.
• Режим сервера – оптимизирует сборку мусора для приложений на стороне сервера.
Примеры• https://github.com/tetianakr/GarbageCollector