SlideShare a Scribd company logo
1 of 26
Download to read offline
Сборка мусора в .NET
Андрей Акиньшин
Барнаульское сообщество .NET разработчиков
bug.ineta.ru
www.facebook.com/groups/dotnetbarnaul/
Управляемая куча
Плюсы:
• Автоматическое управление памятью
Минусы:
• Автоматическое управление памятью
Выделение памяти
Начинаем собирать мусор
• Поколение 0 заполнено
• Вызван метод GC.Collect
• Свободной памяти осталось мало
• Выгрузка домена приложения
• Завершение работы CLR
Алгоритм
• Фаза маркировки
• Фаза сжатия
• Финализация
Маркировка
Корни приложения:
• Статические поля
• Параметры методов
• Локальные переменные
• Регистры процессора
• GCHandle
• Очередь финализации
Поколения
• Чем младше объект, тем короче его время
жизни
• Чем старше объект, тем длиннее его время
жизни
• Убрать часть кучи быстрее, чем всю кучу
• Тяжело перемещать что-то большое
Поколения
• Поколение 0 (∼ 256 KB)
• Поколение 1 (∼ 2 MB)
• Поколение 2 (∼ 10 MB)
GC.MaxGeneration == 2 (но всегда ли?)
Куча больших объектов (LOH)
• Объекты размером от 85000 байт
• Объекты не перемещаются
• Хорошая практика: пулинг больших объектов
No more memory fragmentation in .NET 4.5.1:
GCSettings.LargeObjectHeapCompactionMode =
GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect(); // This will cause the LOH to be compacted (once).
Write barrier method
Card table: храним по одному биту для каждого
128-байтного диапазона
Финализация
Паттерн Disposable
// Design pattern for a base class.
public class Disposable : IDisposable
{
private bool disposed = false;
//Implement IDisposable.
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// Free other state (managed objects).
}
// Free your own state (unmanaged objects).
// Set large fields to null.
disposed = true;
}
}
// Use C# destructor syntax for finalization code.
~Disposable()
{
Dispose(false); // Simply call Dispose(false).
}
}
Типичная ошибка
public static class Global
{
public static event EventHandler Update;
}
public class Foo
{
public Foo()
{
Global.Update += OnUpdate;
}
~Foo()
{
Global.Update -= OnUpdate;
}
private void OnUpdate(object sender, EventArgs e)
{
// Some logic
}
}
Слабые ссылки
var reference = new WeakReference(new object());
Console.WriteLine(reference.Target == null); // False
GC.Collect();
Thread.Sleep(1000);
Console.WriteLine(reference.Target == null); // True
Объекты с гарантированной
финализацией
Свойства CriticalFinalizerObject и его наследников:
• Ранняя JIT-компиляция
• Поздний вызов финализаторов
• Гарантированный вызов финализаторов
Режимы работы GC
• Рабочая станция / сервер
• Однопоточный / фоновый (конкурентный)
GCLatencyMode
• Batch — Отключает фоновую сборку
• Interactive — Включает фоновую сборку
• LowLatency — Сборка поколения 2
выполняется только при GC.Collect() или
малом количестве свободной памяти
• SustainedLowLatency — Продолжительные
периоды нежелательной сборки мусора
Ручное управление
• Ручной вызов сборки мусора GC.Collect()
GCCollectionMode ∈ { Default, Forced,
Optimized}
• AddMemoryPressure() и
RemoveMemoryPressure()
• class MemoryFallPoint
Время вызова сборщика мусора
using System;
using System.Threading;
public static class Program {
public static void Main() {
var t = new Timer(TimerCallback, null, 0, 2000);
Console.ReadLine();
}
private static void TimerCallback(Object o) {
Console.WriteLine("In TimerCallback: " + DateTime.Now);
GC.Collect();
}
}
Время вызова сборщика мусора
public class ImageWithCircle
{
private const int Size = 10000;
private readonly IplImage image;
public ImageWithCircle()
{
image = Cv.CreateImage(new CvSize(Size, Size), BitDepth.U8, 3);
DrawCircle();
}
~ImageWithCircle()
{
Cv.ReleaseImage(image);
}
public void Save()
{
image.SaveImage("image.tif");
}
public void DrawCircle()
{
image.FloodFill(new CvPoint(Size / 2, Size / 2), CvColor.White);
image.Circle(new CvPoint(Size / 2, Size / 2), Size / 4,
CvColor.Random(), 10);
}
}
Время вызова сборщика мусора
public class ImageWithCircle
{
private const int Size = 10000;
private readonly IplImage image;
public ImageWithCircle()
{
image = Cv.CreateImage(new CvSize(Size, Size), BitDepth.U8, 3);
DrawCircle();
}
~ImageWithCircle()
{
Cv.ReleaseImage(image);
}
public void Save()
{
image.SaveImage("image.tif");
GC.KeepAlive(this);
}
public void DrawCircle()
{
image.FloodFill(new CvPoint(Size / 2, Size / 2), CvColor.White);
image.Circle(new CvPoint(Size / 2, Size / 2), Size / 4,
CvColor.Random(), 10);
}
}
Mono
• Boehm
• SGen
Диагностика
• MEMORY LEAKS: THE EASY WAY
Not in this talk. Shell out $500 for a decent
memory profiler.
(c) Sasha Goldshtein
Диагностика
• MEMORY LEAKS: THE EASY WAY
Not in this talk. Shell out $500 for a decent
memory profiler.
(c) Sasha Goldshtein
• sos.dll
• sosex.dll
• Dumps
• ...
Хорошие книжки
Спасибо за внимание!

More Related Content

What's hot

SOA: Строим свой service mesh
SOA: Строим свой service meshSOA: Строим свой service mesh
SOA: Строим свой service meshIvan Kruglov
 
Секреты сборки мусора в Java [DUMP-IT 2012]
Секреты сборки мусора в Java [DUMP-IT 2012]Секреты сборки мусора в Java [DUMP-IT 2012]
Секреты сборки мусора в Java [DUMP-IT 2012]aragozin
 
The Great Migration by Baruch Sadogursky
The Great Migration by Baruch SadogurskyThe Great Migration by Baruch Sadogursky
The Great Migration by Baruch SadogurskyJavaDayUA
 
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)Ontico
 
Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Programming Java - Lection 06 - Multithreading - Lavrentyev FedorProgramming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Programming Java - Lection 06 - Multithreading - Lavrentyev FedorFedor Lavrentyev
 
Реклама со скоростью света. Презентация Сергея Жемжицкого на High Load++ 2014
Реклама со скоростью света. Презентация Сергея Жемжицкого на High Load++ 2014Реклама со скоростью света. Презентация Сергея Жемжицкого на High Load++ 2014
Реклама со скоростью света. Презентация Сергея Жемжицкого на High Load++ 2014CleverDATA
 
RxJava
RxJavaRxJava
RxJavaAnjLab
 
Expert Java Day: Java concurrency
Expert Java Day: Java concurrencyExpert Java Day: Java concurrency
Expert Java Day: Java concurrencyPavel Titkov
 
Секреты сборки мусора в Java
Секреты сборки мусора в JavaСекреты сборки мусора в Java
Секреты сборки мусора в Javaaragozin
 
JS Lab2017_Виталий Лебедев_Практические сложности при разработке на node.js
JS Lab2017_Виталий Лебедев_Практические сложности при разработке на node.js JS Lab2017_Виталий Лебедев_Практические сложности при разработке на node.js
JS Lab2017_Виталий Лебедев_Практические сложности при разработке на node.js GeeksLab Odessa
 
обслуживание мультисайтинга
обслуживание мультисайтингаобслуживание мультисайтинга
обслуживание мультисайтингаInna Tuyeva
 
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)aragozin
 
PostgreSQL Vacuum: Nine Circles of Hell
PostgreSQL Vacuum: Nine Circles of HellPostgreSQL Vacuum: Nine Circles of Hell
PostgreSQL Vacuum: Nine Circles of HellAlexey Lesovsky
 
Дополненная Реальность в Облаке
Дополненная Реальность в ОблакеДополненная Реальность в Облаке
Дополненная Реальность в ОблакеGeeksLab Odessa
 
Caching data outside Java Heap and using Shared Memory in Java
Caching data outside Java Heap and using Shared Memory in JavaCaching data outside Java Heap and using Shared Memory in Java
Caching data outside Java Heap and using Shared Memory in JavaAndrei Pangin
 
мониторинг производительности приложения на PINBA
мониторинг производительности приложения на PINBAмониторинг производительности приложения на PINBA
мониторинг производительности приложения на PINBASlach
 
Как собирать gps треки раз в секунду, экономя траффик
Как собирать gps треки раз в секунду, экономя траффикКак собирать gps треки раз в секунду, экономя траффик
Как собирать gps треки раз в секунду, экономя траффикAndrew Minkin
 
Живая миграция контейнеров: плюсы, минусы, подводные камни -- Павел Емельянов
Живая миграция контейнеров: плюсы, минусы, подводные камни -- Павел ЕмельяновЖивая миграция контейнеров: плюсы, минусы, подводные камни -- Павел Емельянов
Живая миграция контейнеров: плюсы, минусы, подводные камни -- Павел ЕмельяновOpenVZ
 

What's hot (20)

SOA: Строим свой service mesh
SOA: Строим свой service meshSOA: Строим свой service mesh
SOA: Строим свой service mesh
 
Секреты сборки мусора в Java [DUMP-IT 2012]
Секреты сборки мусора в Java [DUMP-IT 2012]Секреты сборки мусора в Java [DUMP-IT 2012]
Секреты сборки мусора в Java [DUMP-IT 2012]
 
The Great Migration by Baruch Sadogursky
The Great Migration by Baruch SadogurskyThe Great Migration by Baruch Sadogursky
The Great Migration by Baruch Sadogursky
 
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
 
Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Programming Java - Lection 06 - Multithreading - Lavrentyev FedorProgramming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor
 
Реклама со скоростью света. Презентация Сергея Жемжицкого на High Load++ 2014
Реклама со скоростью света. Презентация Сергея Жемжицкого на High Load++ 2014Реклама со скоростью света. Презентация Сергея Жемжицкого на High Load++ 2014
Реклама со скоростью света. Презентация Сергея Жемжицкого на High Load++ 2014
 
RxJava
RxJavaRxJava
RxJava
 
Expert Java Day: Java concurrency
Expert Java Day: Java concurrencyExpert Java Day: Java concurrency
Expert Java Day: Java concurrency
 
Секреты сборки мусора в Java
Секреты сборки мусора в JavaСекреты сборки мусора в Java
Секреты сборки мусора в Java
 
JS Lab2017_Виталий Лебедев_Практические сложности при разработке на node.js
JS Lab2017_Виталий Лебедев_Практические сложности при разработке на node.js JS Lab2017_Виталий Лебедев_Практические сложности при разработке на node.js
JS Lab2017_Виталий Лебедев_Практические сложности при разработке на node.js
 
Reactive UI на C#
Reactive UI на C#Reactive UI на C#
Reactive UI на C#
 
обслуживание мультисайтинга
обслуживание мультисайтингаобслуживание мультисайтинга
обслуживание мультисайтинга
 
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
 
PostgreSQL Vacuum: Nine Circles of Hell
PostgreSQL Vacuum: Nine Circles of HellPostgreSQL Vacuum: Nine Circles of Hell
PostgreSQL Vacuum: Nine Circles of Hell
 
Дополненная Реальность в Облаке
Дополненная Реальность в ОблакеДополненная Реальность в Облаке
Дополненная Реальность в Облаке
 
An internal look at HotSpot JVM
An internal look at HotSpot JVMAn internal look at HotSpot JVM
An internal look at HotSpot JVM
 
Caching data outside Java Heap and using Shared Memory in Java
Caching data outside Java Heap and using Shared Memory in JavaCaching data outside Java Heap and using Shared Memory in Java
Caching data outside Java Heap and using Shared Memory in Java
 
мониторинг производительности приложения на PINBA
мониторинг производительности приложения на PINBAмониторинг производительности приложения на PINBA
мониторинг производительности приложения на PINBA
 
Как собирать gps треки раз в секунду, экономя траффик
Как собирать gps треки раз в секунду, экономя траффикКак собирать gps треки раз в секунду, экономя траффик
Как собирать gps треки раз в секунду, экономя траффик
 
Живая миграция контейнеров: плюсы, минусы, подводные камни -- Павел Емельянов
Живая миграция контейнеров: плюсы, минусы, подводные камни -- Павел ЕмельяновЖивая миграция контейнеров: плюсы, минусы, подводные камни -- Павел Емельянов
Живая миграция контейнеров: плюсы, минусы, подводные камни -- Павел Емельянов
 

Viewers also liked

Об особенностях использования значимых типов в .NET
Об особенностях использования значимых типов в .NETОб особенностях использования значимых типов в .NET
Об особенностях использования значимых типов в .NETAndrey Akinshin
 
Let’s talk about microbenchmarking
Let’s talk about microbenchmarkingLet’s talk about microbenchmarking
Let’s talk about microbenchmarkingAndrey Akinshin
 
Низкоуровневые оптимизации .NET-приложений
Низкоуровневые оптимизации .NET-приложенийНизкоуровневые оптимизации .NET-приложений
Низкоуровневые оптимизации .NET-приложенийAndrey Akinshin
 
Продолжаем говорить про арифметику
Продолжаем говорить про арифметикуПродолжаем говорить про арифметику
Продолжаем говорить про арифметикуAndrey Akinshin
 
Теория и практика .NET-бенчмаркинга (25.01.2017, Москва)
 Теория и практика .NET-бенчмаркинга (25.01.2017, Москва) Теория и практика .NET-бенчмаркинга (25.01.2017, Москва)
Теория и практика .NET-бенчмаркинга (25.01.2017, Москва)Andrey Akinshin
 
Основы работы с Git
Основы работы с GitОсновы работы с Git
Основы работы с GitAndrey Akinshin
 

Viewers also liked (7)

Об особенностях использования значимых типов в .NET
Об особенностях использования значимых типов в .NETОб особенностях использования значимых типов в .NET
Об особенностях использования значимых типов в .NET
 
Let’s talk about microbenchmarking
Let’s talk about microbenchmarkingLet’s talk about microbenchmarking
Let’s talk about microbenchmarking
 
Низкоуровневые оптимизации .NET-приложений
Низкоуровневые оптимизации .NET-приложенийНизкоуровневые оптимизации .NET-приложений
Низкоуровневые оптимизации .NET-приложений
 
Продолжаем говорить про арифметику
Продолжаем говорить про арифметикуПродолжаем говорить про арифметику
Продолжаем говорить про арифметику
 
Phd presentation
Phd presentationPhd presentation
Phd presentation
 
Теория и практика .NET-бенчмаркинга (25.01.2017, Москва)
 Теория и практика .NET-бенчмаркинга (25.01.2017, Москва) Теория и практика .NET-бенчмаркинга (25.01.2017, Москва)
Теория и практика .NET-бенчмаркинга (25.01.2017, Москва)
 
Основы работы с Git
Основы работы с GitОсновы работы с Git
Основы работы с Git
 

Similar to Сборка мусора в .NET

Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Ontico
 
Построение мультисервисного стартапа в реалиях full-stack javascript
Построение мультисервисного стартапа в реалиях full-stack javascriptПостроение мультисервисного стартапа в реалиях full-stack javascript
Построение мультисервисного стартапа в реалиях full-stack javascriptFDConf
 
Droidcon Moscow 2015. Android NDK - стоит ли игра свеч Дмитрий Юницкий - Mail...
Droidcon Moscow 2015. Android NDK - стоит ли игра свеч Дмитрий Юницкий - Mail...Droidcon Moscow 2015. Android NDK - стоит ли игра свеч Дмитрий Юницкий - Mail...
Droidcon Moscow 2015. Android NDK - стоит ли игра свеч Дмитрий Юницкий - Mail...Mail.ru Group
 
Developing highload servers with Java
Developing highload servers with JavaDeveloping highload servers with Java
Developing highload servers with JavaAndrei Pangin
 
Оптимизация производительности фронтенда / Игорь Алексеенко (HTML Academy)
Оптимизация производительности фронтенда / Игорь Алексеенко (HTML Academy)Оптимизация производительности фронтенда / Игорь Алексеенко (HTML Academy)
Оптимизация производительности фронтенда / Игорь Алексеенко (HTML Academy)Ontico
 
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...Badoo Development
 
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...SQALab
 
Java tricks for high-load server programming
Java tricks for high-load server programmingJava tricks for high-load server programming
Java tricks for high-load server programmingAndrei Pangin
 
Юрий Насретдинов, Badoo
Юрий Насретдинов, BadooЮрий Насретдинов, Badoo
Юрий Насретдинов, BadooOntico
 
Когда в C# не хватает C++
Когда в C# не хватает C++Когда в C# не хватает C++
Когда в C# не хватает C++Mikhail Shcherbakov
 
Незаурядная Java как инструмент разработки высоконагруженного сервера
Незаурядная Java как инструмент разработки высоконагруженного сервераНезаурядная Java как инструмент разработки высоконагруженного сервера
Незаурядная Java как инструмент разработки высоконагруженного сервераodnoklassniki.ru
 
андрей паньгин
андрей паньгинандрей паньгин
андрей паньгинkuchinskaya
 
Проект «Одноклассники» Mail.Ru Group, Андрей Паньгин
Проект «Одноклассники» Mail.Ru Group, Андрей ПаньгинПроект «Одноклассники» Mail.Ru Group, Андрей Паньгин
Проект «Одноклассники» Mail.Ru Group, Андрей ПаньгинEYevseyeva
 
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...Ontico
 
Performance optimization effective interaction with virtual machine
Performance optimization effective interaction with virtual machinePerformance optimization effective interaction with virtual machine
Performance optimization effective interaction with virtual machineReturn on Intelligence
 
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularizationIvan Krylov
 
Performance optimization: effective interaction with virtual machine
Performance optimization: effective interaction with virtual machinePerformance optimization: effective interaction with virtual machine
Performance optimization: effective interaction with virtual machineReturn on Intelligence
 
Excelsior JET в действии
Excelsior JET в действииExcelsior JET в действии
Excelsior JET в действииNikita Lipsky
 
20100314 virtualization igotti_lecture06
20100314 virtualization igotti_lecture0620100314 virtualization igotti_lecture06
20100314 virtualization igotti_lecture06Computer Science Club
 

Similar to Сборка мусора в .NET (20)

G1
G1G1
G1
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
 
Построение мультисервисного стартапа в реалиях full-stack javascript
Построение мультисервисного стартапа в реалиях full-stack javascriptПостроение мультисервисного стартапа в реалиях full-stack javascript
Построение мультисервисного стартапа в реалиях full-stack javascript
 
Droidcon Moscow 2015. Android NDK - стоит ли игра свеч Дмитрий Юницкий - Mail...
Droidcon Moscow 2015. Android NDK - стоит ли игра свеч Дмитрий Юницкий - Mail...Droidcon Moscow 2015. Android NDK - стоит ли игра свеч Дмитрий Юницкий - Mail...
Droidcon Moscow 2015. Android NDK - стоит ли игра свеч Дмитрий Юницкий - Mail...
 
Developing highload servers with Java
Developing highload servers with JavaDeveloping highload servers with Java
Developing highload servers with Java
 
Оптимизация производительности фронтенда / Игорь Алексеенко (HTML Academy)
Оптимизация производительности фронтенда / Игорь Алексеенко (HTML Academy)Оптимизация производительности фронтенда / Игорь Алексеенко (HTML Academy)
Оптимизация производительности фронтенда / Игорь Алексеенко (HTML Academy)
 
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
 
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
 
Java tricks for high-load server programming
Java tricks for high-load server programmingJava tricks for high-load server programming
Java tricks for high-load server programming
 
Юрий Насретдинов, Badoo
Юрий Насретдинов, BadooЮрий Насретдинов, Badoo
Юрий Насретдинов, Badoo
 
Когда в C# не хватает C++
Когда в C# не хватает C++Когда в C# не хватает C++
Когда в C# не хватает C++
 
Незаурядная Java как инструмент разработки высоконагруженного сервера
Незаурядная Java как инструмент разработки высоконагруженного сервераНезаурядная Java как инструмент разработки высоконагруженного сервера
Незаурядная Java как инструмент разработки высоконагруженного сервера
 
андрей паньгин
андрей паньгинандрей паньгин
андрей паньгин
 
Проект «Одноклассники» Mail.Ru Group, Андрей Паньгин
Проект «Одноклассники» Mail.Ru Group, Андрей ПаньгинПроект «Одноклассники» Mail.Ru Group, Андрей Паньгин
Проект «Одноклассники» Mail.Ru Group, Андрей Паньгин
 
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...
 
Performance optimization effective interaction with virtual machine
Performance optimization effective interaction with virtual machinePerformance optimization effective interaction with virtual machine
Performance optimization effective interaction with virtual machine
 
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularization
 
Performance optimization: effective interaction with virtual machine
Performance optimization: effective interaction with virtual machinePerformance optimization: effective interaction with virtual machine
Performance optimization: effective interaction with virtual machine
 
Excelsior JET в действии
Excelsior JET в действииExcelsior JET в действии
Excelsior JET в действии
 
20100314 virtualization igotti_lecture06
20100314 virtualization igotti_lecture0620100314 virtualization igotti_lecture06
20100314 virtualization igotti_lecture06
 

More from Andrey Akinshin

Поговорим про performance-тестирование
Поговорим про performance-тестированиеПоговорим про performance-тестирование
Поговорим про performance-тестированиеAndrey Akinshin
 
Сложности performance-тестирования
Сложности performance-тестированияСложности performance-тестирования
Сложности performance-тестированияAndrey Akinshin
 
Сложности микробенчмаркинга
Сложности микробенчмаркингаСложности микробенчмаркинга
Сложности микробенчмаркингаAndrey Akinshin
 
Поговорим про память
Поговорим про памятьПоговорим про память
Поговорим про памятьAndrey Akinshin
 
Кроссплатформенный .NET и как там дела с Mono и CoreCLR
Кроссплатформенный .NET и как там дела с Mono и CoreCLRКроссплатформенный .NET и как там дела с Mono и CoreCLR
Кроссплатформенный .NET и как там дела с Mono и CoreCLRAndrey Akinshin
 
Теория и практика .NET-бенчмаркинга (02.11.2016, Екатеринбург)
Теория и практика .NET-бенчмаркинга (02.11.2016, Екатеринбург)Теория и практика .NET-бенчмаркинга (02.11.2016, Екатеринбург)
Теория и практика .NET-бенчмаркинга (02.11.2016, Екатеринбург)Andrey Akinshin
 
Поговорим про арифметику
Поговорим про арифметикуПоговорим про арифметику
Поговорим про арифметикуAndrey Akinshin
 
Подружили CLR и JVM в Project Rider
Подружили CLR и JVM в Project RiderПодружили CLR и JVM в Project Rider
Подружили CLR и JVM в Project RiderAndrey Akinshin
 
Что нам готовит грядущий C#7?
Что нам готовит грядущий C#7?Что нам готовит грядущий C#7?
Что нам готовит грядущий C#7?Andrey Akinshin
 
.NET 2015: Будущее рядом
.NET 2015: Будущее рядом.NET 2015: Будущее рядом
.NET 2015: Будущее рядомAndrey Akinshin
 
Продолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийПродолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийAndrey Akinshin
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийAndrey Akinshin
 
Поговорим о микрооптимизациях .NET-приложений
Поговорим о микрооптимизациях .NET-приложенийПоговорим о микрооптимизациях .NET-приложений
Поговорим о микрооптимизациях .NET-приложенийAndrey Akinshin
 
Практические приёмы оптимизации .NET-приложений
Практические приёмы оптимизации .NET-приложенийПрактические приёмы оптимизации .NET-приложений
Практические приёмы оптимизации .NET-приложенийAndrey Akinshin
 
Поговорим о различных версиях .NET
Поговорим о различных версиях .NETПоговорим о различных версиях .NET
Поговорим о различных версиях .NETAndrey Akinshin
 

More from Andrey Akinshin (15)

Поговорим про performance-тестирование
Поговорим про performance-тестированиеПоговорим про performance-тестирование
Поговорим про performance-тестирование
 
Сложности performance-тестирования
Сложности performance-тестированияСложности performance-тестирования
Сложности performance-тестирования
 
Сложности микробенчмаркинга
Сложности микробенчмаркингаСложности микробенчмаркинга
Сложности микробенчмаркинга
 
Поговорим про память
Поговорим про памятьПоговорим про память
Поговорим про память
 
Кроссплатформенный .NET и как там дела с Mono и CoreCLR
Кроссплатформенный .NET и как там дела с Mono и CoreCLRКроссплатформенный .NET и как там дела с Mono и CoreCLR
Кроссплатформенный .NET и как там дела с Mono и CoreCLR
 
Теория и практика .NET-бенчмаркинга (02.11.2016, Екатеринбург)
Теория и практика .NET-бенчмаркинга (02.11.2016, Екатеринбург)Теория и практика .NET-бенчмаркинга (02.11.2016, Екатеринбург)
Теория и практика .NET-бенчмаркинга (02.11.2016, Екатеринбург)
 
Поговорим про арифметику
Поговорим про арифметикуПоговорим про арифметику
Поговорим про арифметику
 
Подружили CLR и JVM в Project Rider
Подружили CLR и JVM в Project RiderПодружили CLR и JVM в Project Rider
Подружили CLR и JVM в Project Rider
 
Что нам готовит грядущий C#7?
Что нам готовит грядущий C#7?Что нам готовит грядущий C#7?
Что нам готовит грядущий C#7?
 
.NET 2015: Будущее рядом
.NET 2015: Будущее рядом.NET 2015: Будущее рядом
.NET 2015: Будущее рядом
 
Продолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийПродолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложений
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложений
 
Поговорим о микрооптимизациях .NET-приложений
Поговорим о микрооптимизациях .NET-приложенийПоговорим о микрооптимизациях .NET-приложений
Поговорим о микрооптимизациях .NET-приложений
 
Практические приёмы оптимизации .NET-приложений
Практические приёмы оптимизации .NET-приложенийПрактические приёмы оптимизации .NET-приложений
Практические приёмы оптимизации .NET-приложений
 
Поговорим о различных версиях .NET
Поговорим о различных версиях .NETПоговорим о различных версиях .NET
Поговорим о различных версиях .NET
 

Сборка мусора в .NET

  • 1. Сборка мусора в .NET Андрей Акиньшин Барнаульское сообщество .NET разработчиков bug.ineta.ru www.facebook.com/groups/dotnetbarnaul/
  • 2. Управляемая куча Плюсы: • Автоматическое управление памятью Минусы: • Автоматическое управление памятью
  • 4. Начинаем собирать мусор • Поколение 0 заполнено • Вызван метод GC.Collect • Свободной памяти осталось мало • Выгрузка домена приложения • Завершение работы CLR
  • 5. Алгоритм • Фаза маркировки • Фаза сжатия • Финализация
  • 6. Маркировка Корни приложения: • Статические поля • Параметры методов • Локальные переменные • Регистры процессора • GCHandle • Очередь финализации
  • 7. Поколения • Чем младше объект, тем короче его время жизни • Чем старше объект, тем длиннее его время жизни • Убрать часть кучи быстрее, чем всю кучу • Тяжело перемещать что-то большое
  • 8. Поколения • Поколение 0 (∼ 256 KB) • Поколение 1 (∼ 2 MB) • Поколение 2 (∼ 10 MB) GC.MaxGeneration == 2 (но всегда ли?)
  • 9. Куча больших объектов (LOH) • Объекты размером от 85000 байт • Объекты не перемещаются • Хорошая практика: пулинг больших объектов No more memory fragmentation in .NET 4.5.1: GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce; GC.Collect(); // This will cause the LOH to be compacted (once).
  • 10. Write barrier method Card table: храним по одному биту для каждого 128-байтного диапазона
  • 12. Паттерн Disposable // Design pattern for a base class. public class Disposable : IDisposable { private bool disposed = false; //Implement IDisposable. public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (!disposed) { if (disposing) { // Free other state (managed objects). } // Free your own state (unmanaged objects). // Set large fields to null. disposed = true; } } // Use C# destructor syntax for finalization code. ~Disposable() { Dispose(false); // Simply call Dispose(false). } }
  • 13. Типичная ошибка public static class Global { public static event EventHandler Update; } public class Foo { public Foo() { Global.Update += OnUpdate; } ~Foo() { Global.Update -= OnUpdate; } private void OnUpdate(object sender, EventArgs e) { // Some logic } }
  • 14. Слабые ссылки var reference = new WeakReference(new object()); Console.WriteLine(reference.Target == null); // False GC.Collect(); Thread.Sleep(1000); Console.WriteLine(reference.Target == null); // True
  • 15. Объекты с гарантированной финализацией Свойства CriticalFinalizerObject и его наследников: • Ранняя JIT-компиляция • Поздний вызов финализаторов • Гарантированный вызов финализаторов
  • 16. Режимы работы GC • Рабочая станция / сервер • Однопоточный / фоновый (конкурентный)
  • 17. GCLatencyMode • Batch — Отключает фоновую сборку • Interactive — Включает фоновую сборку • LowLatency — Сборка поколения 2 выполняется только при GC.Collect() или малом количестве свободной памяти • SustainedLowLatency — Продолжительные периоды нежелательной сборки мусора
  • 18. Ручное управление • Ручной вызов сборки мусора GC.Collect() GCCollectionMode ∈ { Default, Forced, Optimized} • AddMemoryPressure() и RemoveMemoryPressure() • class MemoryFallPoint
  • 19. Время вызова сборщика мусора using System; using System.Threading; public static class Program { public static void Main() { var t = new Timer(TimerCallback, null, 0, 2000); Console.ReadLine(); } private static void TimerCallback(Object o) { Console.WriteLine("In TimerCallback: " + DateTime.Now); GC.Collect(); } }
  • 20. Время вызова сборщика мусора public class ImageWithCircle { private const int Size = 10000; private readonly IplImage image; public ImageWithCircle() { image = Cv.CreateImage(new CvSize(Size, Size), BitDepth.U8, 3); DrawCircle(); } ~ImageWithCircle() { Cv.ReleaseImage(image); } public void Save() { image.SaveImage("image.tif"); } public void DrawCircle() { image.FloodFill(new CvPoint(Size / 2, Size / 2), CvColor.White); image.Circle(new CvPoint(Size / 2, Size / 2), Size / 4, CvColor.Random(), 10); } }
  • 21. Время вызова сборщика мусора public class ImageWithCircle { private const int Size = 10000; private readonly IplImage image; public ImageWithCircle() { image = Cv.CreateImage(new CvSize(Size, Size), BitDepth.U8, 3); DrawCircle(); } ~ImageWithCircle() { Cv.ReleaseImage(image); } public void Save() { image.SaveImage("image.tif"); GC.KeepAlive(this); } public void DrawCircle() { image.FloodFill(new CvPoint(Size / 2, Size / 2), CvColor.White); image.Circle(new CvPoint(Size / 2, Size / 2), Size / 4, CvColor.Random(), 10); } }
  • 23. Диагностика • MEMORY LEAKS: THE EASY WAY Not in this talk. Shell out $500 for a decent memory profiler. (c) Sasha Goldshtein
  • 24. Диагностика • MEMORY LEAKS: THE EASY WAY Not in this talk. Shell out $500 for a decent memory profiler. (c) Sasha Goldshtein • sos.dll • sosex.dll • Dumps • ...