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

26
Сборка мусора в .NET Андрей Акиньшин Барнаульское сообщество .NET разработчиков bug.ineta.ru www.facebook.com/groups/dotnetbarnaul/

Upload: andrey-akinshin

Post on 06-Jul-2015

2.418 views

Category:

Education


1 download

DESCRIPTION

Доклад со встречи барнаульского сообщества .NET разработчиков, состоявшейся 12 марта в офисе компании

TRANSCRIPT

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

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

Андрей Акиньшин

Барнаульское сообщество .NET разработчиков

bug.ineta.ruwww.facebook.com/groups/dotnetbarnaul/

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

Управляемая куча

Плюсы:• Автоматическое управление памятью

Минусы:• Автоматическое управление памятью

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

Выделение памяти

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

Начинаем собирать мусор

• Поколение 0 заполнено• Вызван метод GC.Collect• Свободной памяти осталось мало• Выгрузка домена приложения• Завершение работы CLR

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

Алгоритм

• Фаза маркировки• Фаза сжатия• Финализация

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

Маркировка

Корни приложения:• Статические поля• Параметры методов• Локальные переменные• Регистры процессора• GCHandle• Очередь финализации

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

Поколения

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

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

• Убрать часть кучи быстрее, чем всю кучу• Тяжело перемещать что-то большое

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

Поколения

• Поколение 0 (∼ 256 KB)• Поколение 1 (∼ 2 MB)• Поколение 2 (∼ 10 MB)

GC.MaxGeneration == 2 (но всегда ли?)

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

Куча больших объектов (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).

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

Write barrier method

Card table: храним по одному биту для каждого128-байтного диапазона

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

Финализация

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

Паттерн 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).}

}

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

Типичная ошибка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}

}

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

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

var reference = new WeakReference(new object());

Console.WriteLine(reference.Target == null); // False

GC.Collect();Thread.Sleep(1000);

Console.WriteLine(reference.Target == null); // True

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

Объекты с гарантированнойфинализацией

Свойства CriticalFinalizerObject и его наследников:

• Ранняя JIT-компиляция• Поздний вызов финализаторов• Гарантированный вызов финализаторов

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

Режимы работы GC

• Рабочая станция / сервер• Однопоточный / фоновый (конкурентный)

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

GCLatencyMode

• Batch — Отключает фоновую сборку• Interactive — Включает фоновую сборку• LowLatency — Сборка поколения 2выполняется только при GC.Collect() илималом количестве свободной памяти

• SustainedLowLatency — Продолжительныепериоды нежелательной сборки мусора

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

Ручное управление

• Ручной вызов сборки мусора GC.Collect()GCCollectionMode ∈ { Default, Forced,Optimized}

• AddMemoryPressure() иRemoveMemoryPressure()

• class MemoryFallPoint

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

Время вызова сборщика мусора

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();

}}

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

Время вызова сборщика мусора

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);}

}

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

Время вызова сборщика мусора

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);}

}

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

Mono

• Boehm• SGen

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

Диагностика

• MEMORY LEAKS: THE EASY WAYNot in this talk. Shell out $500 for a decentmemory profiler.(c) Sasha Goldshtein

• sos.dll• sosex.dll• Dumps• ...

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

Диагностика

• MEMORY LEAKS: THE EASY WAYNot in this talk. Shell out $500 for a decentmemory profiler.(c) Sasha Goldshtein

• sos.dll• sosex.dll• Dumps• ...

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

Хорошие книжки

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

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