Upload
tym32167
View
577
Download
0
Embed Size (px)
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/
twitter.com/tym32167