garbage collector

21
ТРЕНИНГ НА ТЕМУ: GARBAGE COLLECTOR

Upload: delphicon

Post on 12-Apr-2017

180 views

Category:

Engineering


0 download

TRANSCRIPT

Page 1: Garbage collector

ТРЕНИНГ НА ТЕМУ:GARBAGE COLLECTOR

Page 2: Garbage collector

Парадигмы программированияОсновные источники ошибок программирования:• забыть освободить память, ставшую ненужной• пытаться использовать уже освобожденную память

Нельзя предсказать ни последствий этих ошибок, ни периодичность их появления.

Они ведут к:• утечке ресурсов (увеличивая потребление памяти)• повреждению объектов (дестабилизируя систему)

Page 3: Garbage collector

РешениеСборка мусора (garbage collection) полностью освобождает разработчика от необходимости следить за использованием и своевременным освобождением памяти.

Ресурсы выделяются из управляемой кучи:• IL-команда newobj (оператор new ) создает объект• указатель NextObjPtr определяет, где в куче будет выделена

память для следующего объекта.

Если свободного адресного пространства недостаточно:• Куча добавляет байты, необходимые для объекта, к адресу,

заданному указателем NextObjPtr• Если результирующее значение выходит за пределы адресного

пространства, происходит сборка мусора.

Page 4: Garbage collector

Алгоритм сборки мусора

Минусы:Сборка мусора бьет по производительности.

Плюсы:Исключается утечка объектов.Невозможно получить доступ к освобожденному объекту.Управляемые объекты не фрагментируют виртуальное адресное пространство процесса.

У каждого приложения есть набор корней (roots). Корень - адрес указателя на объект ссылочного типа. Корни: статические поля, параметры методов, локальные переменные, регистры процессора.

Первый шаг. Маркировка. Вычисляется граф живых объектов.

Второй шаг. Сжатие. Производится уплотнение кучи.

Page 5: Garbage collector

Устройство объектаenum_flag_ContainsPointers (0x40000)enum_flag_large_Object (0x20000)enum_flag_HasFinalizer (0x100000)

Page 6: Garbage collector

Поколения• Поколения - это механизм сборщика мусора в CLR,

единственным назначением которого является повышение производительности приложения.

• CG.NET поддерживает три поколения: 0, 1 и 2

Page 7: Garbage collector

Алгоритм CG в Small Object Heap

Page 8: Garbage collector

Алгоритм CG в Large Object Heap

From To425000 16777216

Free Space Table

From To658000 16777216

94208 182272

From To425000 16777216

94208 182272

Page 9: Garbage collector

System.GC• System.GC – класс для

управления сбором мусора.

• Позволяет получать информацию о поколениях, а также принудительно инициировать сбор мусора.

• Позволяет отменить работу деструктора объекта.

Page 10: Garbage collector

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

Мотивы вызова методов финализации:• Заполнение поколения О приводит к запуску сборщика

мусора.• Явный вызов статического метода Collect объекта

System.GC.• Windows сообщает о нехватке памяти.• Выгрузка средой CLR домена приложения.• Закрытие CLR.

Page 11: Garbage collector

Определение метода финализации

Page 12: Garbage collector

Механизм финализации

Page 13: Garbage collector

Особенности использования финазицации

• Методы Finalize оказывают заметное влияние на производительность, потому реализовывать его необходимо только в объектах, требующих завершения.

• Время исполнения финализаторов не может быть определено заранее.

• Следует избегать написание методов Finalize, обращающихся к другим объектам, типы которых определяют метод Finalize.

Page 14: Garbage collector

IDisposable• Интерфейс IDisposable

включает в себя единственный метод - void Dispose().

Назначение интерфейса IDisposable – класс сможет освобождать неуправляемые ресурсы тогда, когда это необходимо разработчику.

Page 15: Garbage collector

IDisposable• При работе с типами .NET, которые поддерживают

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

• Некоторые классы переименовывают Dispose() в Close().

Page 16: Garbage collector

Советы по использованию метода Dispose()

• При вызове метода Dispose() стоит проинформировать сборщик мусора о пропуске финализации, вызвав метод GC.SuppressFinalize().

• Следует разрешить многократный вызов метода Dispose() без генерации исключений.

• Даже при наличии явного управления с помощью метода Dispose следует предоставить и неявное освобождение ресурсов с использованием метода Finalize. 

Page 17: Garbage collector

Паттерн Dispose

• Формализованный шаблон освобождения ресурсов Microsoft, который позволяет достичь оптимального баланса между надежностью, удобством в обслуживании и производительностью.

• Используйте формализованный шаблон очистки для того, чтобы обеспечить корректную работу как финализатора, так и Dispose().

Page 18: Garbage collector

Паттерн Dispose

Page 19: Garbage collector

Finalize() vs. Dispose()

Finalize() рекомендуется добавлять в код класса для освобождения неуправляемых ресурсов.

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

Finalize() вызывается, когда сборщик мусора решит уничтожить объект.

Метод Dispose() должен вручную вызываться пользователем этого объекта.

Метода Finalize(), допускается переопределять только в классах.

Интерфейс IDisposable может быть реализован как в классах, так и в структурах.

Page 20: Garbage collector

Режимы сборки мусора

• Режим рабочей станции – настраивает сборку мусора для приложений на стороне клиента.

• Режим сервера – оптимизирует сборку мусора для приложений на стороне сервера.

Page 21: Garbage collector

Примеры• https://github.com/tetianakr/GarbageCollector