Сборка мусора в .NET
-
Upload
andrey-akinshin -
Category
Education
-
view
2.421 -
download
1
description
Transcript of Сборка мусора в .NET
![Page 1: Сборка мусора в .NET](https://reader033.fdocuments.net/reader033/viewer/2022052909/5599d7ec1a28aba3068b47b8/html5/thumbnails/1.jpg)
Сборка мусора в .NET
Андрей Акиньшин
Барнаульское сообщество .NET разработчиков
bug.ineta.ruwww.facebook.com/groups/dotnetbarnaul/
![Page 2: Сборка мусора в .NET](https://reader033.fdocuments.net/reader033/viewer/2022052909/5599d7ec1a28aba3068b47b8/html5/thumbnails/2.jpg)
Управляемая куча
Плюсы:• Автоматическое управление памятью
Минусы:• Автоматическое управление памятью
![Page 3: Сборка мусора в .NET](https://reader033.fdocuments.net/reader033/viewer/2022052909/5599d7ec1a28aba3068b47b8/html5/thumbnails/3.jpg)
Выделение памяти
![Page 4: Сборка мусора в .NET](https://reader033.fdocuments.net/reader033/viewer/2022052909/5599d7ec1a28aba3068b47b8/html5/thumbnails/4.jpg)
Начинаем собирать мусор
• Поколение 0 заполнено• Вызван метод GC.Collect• Свободной памяти осталось мало• Выгрузка домена приложения• Завершение работы CLR
![Page 5: Сборка мусора в .NET](https://reader033.fdocuments.net/reader033/viewer/2022052909/5599d7ec1a28aba3068b47b8/html5/thumbnails/5.jpg)
Алгоритм
• Фаза маркировки• Фаза сжатия• Финализация
![Page 6: Сборка мусора в .NET](https://reader033.fdocuments.net/reader033/viewer/2022052909/5599d7ec1a28aba3068b47b8/html5/thumbnails/6.jpg)
Маркировка
Корни приложения:• Статические поля• Параметры методов• Локальные переменные• Регистры процессора• GCHandle• Очередь финализации
![Page 7: Сборка мусора в .NET](https://reader033.fdocuments.net/reader033/viewer/2022052909/5599d7ec1a28aba3068b47b8/html5/thumbnails/7.jpg)
Поколения
• Чем младше объект, тем короче его времяжизни
• Чем старше объект, тем длиннее его времяжизни
• Убрать часть кучи быстрее, чем всю кучу• Тяжело перемещать что-то большое
![Page 8: Сборка мусора в .NET](https://reader033.fdocuments.net/reader033/viewer/2022052909/5599d7ec1a28aba3068b47b8/html5/thumbnails/8.jpg)
Поколения
• Поколение 0 (∼ 256 KB)• Поколение 1 (∼ 2 MB)• Поколение 2 (∼ 10 MB)
GC.MaxGeneration == 2 (но всегда ли?)
![Page 9: Сборка мусора в .NET](https://reader033.fdocuments.net/reader033/viewer/2022052909/5599d7ec1a28aba3068b47b8/html5/thumbnails/9.jpg)
Куча больших объектов (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](https://reader033.fdocuments.net/reader033/viewer/2022052909/5599d7ec1a28aba3068b47b8/html5/thumbnails/10.jpg)
Write barrier method
Card table: храним по одному биту для каждого128-байтного диапазона
![Page 11: Сборка мусора в .NET](https://reader033.fdocuments.net/reader033/viewer/2022052909/5599d7ec1a28aba3068b47b8/html5/thumbnails/11.jpg)
Финализация
![Page 12: Сборка мусора в .NET](https://reader033.fdocuments.net/reader033/viewer/2022052909/5599d7ec1a28aba3068b47b8/html5/thumbnails/12.jpg)
Паттерн 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](https://reader033.fdocuments.net/reader033/viewer/2022052909/5599d7ec1a28aba3068b47b8/html5/thumbnails/13.jpg)
Типичная ошибка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](https://reader033.fdocuments.net/reader033/viewer/2022052909/5599d7ec1a28aba3068b47b8/html5/thumbnails/14.jpg)
Слабые ссылки
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](https://reader033.fdocuments.net/reader033/viewer/2022052909/5599d7ec1a28aba3068b47b8/html5/thumbnails/15.jpg)
Объекты с гарантированнойфинализацией
Свойства CriticalFinalizerObject и его наследников:
• Ранняя JIT-компиляция• Поздний вызов финализаторов• Гарантированный вызов финализаторов
![Page 16: Сборка мусора в .NET](https://reader033.fdocuments.net/reader033/viewer/2022052909/5599d7ec1a28aba3068b47b8/html5/thumbnails/16.jpg)
Режимы работы GC
• Рабочая станция / сервер• Однопоточный / фоновый (конкурентный)
![Page 17: Сборка мусора в .NET](https://reader033.fdocuments.net/reader033/viewer/2022052909/5599d7ec1a28aba3068b47b8/html5/thumbnails/17.jpg)
GCLatencyMode
• Batch — Отключает фоновую сборку• Interactive — Включает фоновую сборку• LowLatency — Сборка поколения 2выполняется только при GC.Collect() илималом количестве свободной памяти
• SustainedLowLatency — Продолжительныепериоды нежелательной сборки мусора
![Page 18: Сборка мусора в .NET](https://reader033.fdocuments.net/reader033/viewer/2022052909/5599d7ec1a28aba3068b47b8/html5/thumbnails/18.jpg)
Ручное управление
• Ручной вызов сборки мусора GC.Collect()GCCollectionMode ∈ { Default, Forced,Optimized}
• AddMemoryPressure() иRemoveMemoryPressure()
• class MemoryFallPoint
![Page 19: Сборка мусора в .NET](https://reader033.fdocuments.net/reader033/viewer/2022052909/5599d7ec1a28aba3068b47b8/html5/thumbnails/19.jpg)
Время вызова сборщика мусора
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](https://reader033.fdocuments.net/reader033/viewer/2022052909/5599d7ec1a28aba3068b47b8/html5/thumbnails/20.jpg)
Время вызова сборщика мусора
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](https://reader033.fdocuments.net/reader033/viewer/2022052909/5599d7ec1a28aba3068b47b8/html5/thumbnails/21.jpg)
Время вызова сборщика мусора
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](https://reader033.fdocuments.net/reader033/viewer/2022052909/5599d7ec1a28aba3068b47b8/html5/thumbnails/22.jpg)
Mono
• Boehm• SGen
![Page 23: Сборка мусора в .NET](https://reader033.fdocuments.net/reader033/viewer/2022052909/5599d7ec1a28aba3068b47b8/html5/thumbnails/23.jpg)
Диагностика
• 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](https://reader033.fdocuments.net/reader033/viewer/2022052909/5599d7ec1a28aba3068b47b8/html5/thumbnails/24.jpg)
Диагностика
• 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](https://reader033.fdocuments.net/reader033/viewer/2022052909/5599d7ec1a28aba3068b47b8/html5/thumbnails/25.jpg)
Хорошие книжки
![Page 26: Сборка мусора в .NET](https://reader033.fdocuments.net/reader033/viewer/2022052909/5599d7ec1a28aba3068b47b8/html5/thumbnails/26.jpg)
Спасибо за внимание!