Внутреннее устройство GC

Preview:

Citation preview

Внутреннее устройство GC

Мурадов Артем

http://muradov.pro/

9-я конференция .NET разработчиков

12 октября 2014

dotnetconf.ru

2

Garbage collection

Что это?

Зачем это?

3

Garbage collection

Висячие ссылки

Утечки памяти

Двойное освобождение памяти

Эффективная реализация неизменяемых структур данных

Быстрое выделение памяти

Требует дополнительных ресурсов

Момент начала сборки мусора заранее неизвестен

Отсутствие RAII

4

Как это работает

Принцип работы• За сборку мусора отвечает среда исполнения

• Точное время начала автоматической сборки мусора определить

невозможно

Достижимость объектов• Корневые объекты

• Объекты, на которые ссылаются достижимые

5

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

• Копирующая сборка мусора

• Подсчет ссылок

• Сборка на основе трассировки

• ……

6

Копирующая сборка мусора

Выделение памяти происходит очень быстро

Требуется в 2 раза больше памяти

Требует перемещений большого объема памяти

7

Подсчет ссылок

Определение достижимых объектов тривиально

Счетчик занимает памятьСложно работать с циклическими ссылкамиЗамедляет присваивание ссылок

8

Сборка на основе трассировки

Циклические ссылки не проблемаОтсутствие фрагментации памяти

Требуется время на маркировкуТребуется время на сжатиеТребует остановки рабочих потоков

9

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

• Неперемещающие1. Быстрое освобождение

2. Долгое выделение

• Перемещающие1. Быстрое выделение памяти

2. Совместные объекты в кэше

3. Необходимость дефрагментации – долго!

4. Изменение ссылок на перемещенные объекты – опасно!

5. Работа с небезопасным кодом

10

.NET• Сборщик мусора и управляемая куча

• Корни и поколения

• Финализаторы и ресурсы

• Слабые ссылки

• Мониторинг

11

Сборщик мусора и управляемая куча

Быстрое выделение памяти – просто сдвиг указателя на начало свободного участка памяти

Явно освобождать память не нужно – это забота сборщика мусора

Если в куче места не хватает, начинается сборка мусора

12

Фазы сборки мусора

• Маркировка

• Очистка

• Сжатие

13

Условия начала сборки мусора

Недостаточно физической памяти в системе.

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

Вызывается метод GC.Collect. Практически во всех случаях вызов этого метода не потребуется, так как сборщик мусора работает непрерывно. Этот метод в основном используется для уникальных ситуаций и тестирования.

14

Корни

Статические поля

Параметры методов

Локальные переменные

Регистры процессора

GCHandle сборщика мусора (Normal/Pinned)

Указатели в очереди финализации

15

Пример с таймером

16

Поколения объектов

Поколение – серия объектов с близким временем существования.

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

во всей куче

17

Поколения объектов

Сборка мусора только текущего поколения и

всех меньших поколений

Объект младшего поколения может

ссылаться на объект старшего

Write Barrier и Card Table

18

Очистка и сжатие

• Очистить память

• Переместить

объекты

• Обновить ссылки

19

Ещё глубже

20

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

прежде чем сборщик мусора освободит занятую им память.

Любой тип, выполняющий функцию оболочки машинного ресурса,

должен поддерживать финализацию.

• Отдельный поток для финализации

• Объекты в очереди на финализацию подобны корням

• Воскрешение

• Вызывается даже при исключении в конструкторе

21

System.Runtime.ConstrainedExecution.CriticalFinalizerObject

• Компиляция методов финализации

• Вызов финализаторов происходит после

объектов, не унаследованных от CriticalFinalizerObject

• Финализаторы вызываются даже если домен

приложения был аварийно завершен

• System.Runtime.InteropServices.SafeHandle для

ресурсов Windows

• System.Runtime.InteropServices.CriticalHandle

22

Финализация управляемого

ресурса• Больше времени на выделение памяти• Объект и все, на что он ссылается, переходит в

старшее поколение• Удаление требует ресурсов

• Шаблон освобождения ресурсов• Dispose & Close• RAII & IDisposable• using

23

GC handle table

• System.Runtime.InteropServices.GCHandle

• GCHandleType (Weak / WeakTrackRessurrection / Normal / Pinned)

• Сборщик мусора и GCHandle

Маркировка

Weak

Список финализации

WeakTrackRessurrection

Очистка и сжатие

24

Слабые ссылки

• System.WeakReference

• Не работает с Normal и Pinned

• Не реализует IDisposable

• Занимает больше места

• Находится в куче

• Слабые делегаты• System.Runtime.CompilerServices.ConditionalWeakTable<TKey,

TValue>

25

Другие возможности GC

• GC.AddMemoryPressure, GC.RemoveMemoryPressure

• System.Runtime.InteropServices.HandleCollector

• System.Runtime.MemoryFailPoint

• System.GC.Collect

• System.GC.MaxGeneration

• System.GCCollectionMode• Default

• Forced

• Optimized

• …

26

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

• Рабочая станция

• Параллельная (маркировка)/фоновая сборка мусора (2)

• Однопоточная сборка мусора

• Сервер

• На каждый процессор отдельная куча

• На каждый процессор отдельный поток

System.Runtime.GCSettings.LatencyMode

Batch

Interactive

LowLatency

SustainedLowLatency

27

Куча больших объектов (LOH)

• Специальная область для больших объектов (85 000 байт

и более)

• Считается размер объекта

• Поколение 2

• Пулинг

• Free Space Table

System.Runtime.GCSettings.LargeObjectHeapCompactionMode

• Default

• CompactOnce

28

Мониторинг• int System.GC.CollectionCount(int generation)

• long System.GC.GetTotalMemory(bool forceFullCollection)

• Счетчики производительности

• CLR Profiler

• SOS.dll

29

Источники

http://msdn.microsoft.com/

http://blogs.msdn.com/

http://blogs.msdn.com/b/abhinaba/ (Abhinaba Basu [MSFT])

https://wikipedia.org

http://sergeyteplyakov.blogspot.ru/2012/10/net.html

30

Спасибо за внимание

Мурадов Артем

http://muradov.pro/

tym32167@gmail.com

twitter.com/tym32167

Recommended