30
Внутреннее устройство GC Мурадов Артем http://muradov.pro/ 9-я конференция .NET разработчиков 12 октября 2014 dotnetconf.ru

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

Embed Size (px)

Citation preview

Page 1: Внутреннее устройство GC

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

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

http://muradov.pro/

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

12 октября 2014

dotnetconf.ru

Page 2: Внутреннее устройство GC

2

Garbage collection

Что это?

Зачем это?

Page 3: Внутреннее устройство GC

3

Garbage collection

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

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

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

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

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

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

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

Отсутствие RAII

Page 4: Внутреннее устройство GC

4

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

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

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

невозможно

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

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

Page 5: Внутреннее устройство GC

5

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

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

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

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

• ……

Page 6: Внутреннее устройство GC

6

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

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

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

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

Page 7: Внутреннее устройство GC

7

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

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

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

Page 8: Внутреннее устройство GC

8

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

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

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

Page 9: Внутреннее устройство GC

9

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

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

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

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

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

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

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

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

Page 10: Внутреннее устройство GC

10

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

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

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

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

• Мониторинг

Page 11: Внутреннее устройство GC

11

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

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

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

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

Page 12: Внутреннее устройство GC

12

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

• Маркировка

• Очистка

• Сжатие

Page 13: Внутреннее устройство GC

13

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

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

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

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

Page 14: Внутреннее устройство GC

14

Корни

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

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

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

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

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

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

Page 15: Внутреннее устройство GC

15

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

Page 16: Внутреннее устройство GC

16

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

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

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

во всей куче

Page 17: Внутреннее устройство GC

17

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

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

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

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

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

Write Barrier и Card Table

Page 18: Внутреннее устройство GC

18

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

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

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

объекты

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

Page 19: Внутреннее устройство GC

19

Ещё глубже

Page 20: Внутреннее устройство GC

20

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

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

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

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

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

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

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

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

Page 21: Внутреннее устройство GC

21

System.Runtime.ConstrainedExecution.CriticalFinalizerObject

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

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

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

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

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

• System.Runtime.InteropServices.SafeHandle для

ресурсов Windows

• System.Runtime.InteropServices.CriticalHandle

Page 22: Внутреннее устройство GC

22

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

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

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

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

Page 23: Внутреннее устройство GC

23

GC handle table

• System.Runtime.InteropServices.GCHandle

• GCHandleType (Weak / WeakTrackRessurrection / Normal / Pinned)

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

Маркировка

Weak

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

WeakTrackRessurrection

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

Page 24: Внутреннее устройство GC

24

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

• System.WeakReference

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

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

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

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

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

TValue>

Page 25: Внутреннее устройство GC

25

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

• GC.AddMemoryPressure, GC.RemoveMemoryPressure

• System.Runtime.InteropServices.HandleCollector

• System.Runtime.MemoryFailPoint

• System.GC.Collect

• System.GC.MaxGeneration

• System.GCCollectionMode• Default

• Forced

• Optimized

• …

Page 26: Внутреннее устройство GC

26

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

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

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

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

• Сервер

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

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

System.Runtime.GCSettings.LatencyMode

Batch

Interactive

LowLatency

SustainedLowLatency

Page 27: Внутреннее устройство GC

27

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

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

и более)

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

• Поколение 2

• Пулинг

• Free Space Table

System.Runtime.GCSettings.LargeObjectHeapCompactionMode

• Default

• CompactOnce

Page 28: Внутреннее устройство GC

28

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

• long System.GC.GetTotalMemory(bool forceFullCollection)

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

• CLR Profiler

• SOS.dll

Page 29: Внутреннее устройство GC

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

Page 30: Внутреннее устройство GC

30

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

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

http://muradov.pro/

[email protected]

twitter.com/tym32167