Deep Dumpster Diving

47
DEEP DUMPSTER DIVING A close look at .Net garbage collection Ronn Black October 2009

description

Slides from Session "Deep Dumpster Diving"

Transcript of Deep Dumpster Diving

Page 1: Deep Dumpster Diving

DEEP DUMPSTER DIVING

A close look at .Net garbage collection

Ronn Black

October 2009

Page 2: Deep Dumpster Diving

Why should I care?

Page 3: Deep Dumpster Diving

Demo 1 (Word Count)using System;using System.Collections.Generic;using System.Diagnostics;using System.IO;

public class MyClass{

public static void RunSnippet(){

while(true){

Stopwatch watch = new Stopwatch();watch.Start();StreamReader sr = new StreamReader(@"C:\Users\Ronn\Documents\My

Code Snippets\Garbage Collection\catcher.txt");string text = sr.ReadToEnd();int wordCount = text.Split().Length;Console.WriteLine("{0} Words", wordCount);watch.Stop();Console.WriteLine(watch.ElapsedMilliseconds + " Milliseconds");

}

}

Page 4: Deep Dumpster Diving
Page 5: Deep Dumpster Diving

using System;using System.Collections.Generic;using System.Threading;using System.Runtime.CompilerServices;

public class MyClass{

static Byte[] bytes;public static void RunSnippet(){

Timer tmr = new Timer(M, null, 0, 1000);Thread.Sleep(20);for(int i = 0; i < 1000; i++)

bytes = new Byte[2000];

Console.ReadLine();}

static void M(object state){

Console.WriteLine("M - " + DateTime.Now);}

Demo 2

Page 6: Deep Dumpster Diving

Unmanaged Memory Management

Page 7: Deep Dumpster Diving

Unused AreaHi Address

Low Address

ReservedReserved

Args & VariablesArgs & Variables

StackStack

HeapHeap

Stack PointerUnused Area

Page 8: Deep Dumpster Diving
Page 9: Deep Dumpster Diving
Page 10: Deep Dumpster Diving
Page 11: Deep Dumpster Diving
Page 12: Deep Dumpster Diving

NextObjPtr

Page 13: Deep Dumpster Diving

NextObjPtr

Page 14: Deep Dumpster Diving

RootsRoots

NextObjPtr

Page 15: Deep Dumpster Diving

RootsRoots

NextObjPtr

Page 16: Deep Dumpster Diving

~MyClass(){

//Do work here…}

MyClass.Finalize(){

//Do work here…}

=

Finalizers

Page 17: Deep Dumpster Diving

RootsRoots

F

G

A

B

C

E

H

I

DFreachable Queue

C

E

F

I

Finalization Queue

Page 18: Deep Dumpster Diving

F

G (x)

A

RootsRoots

B (x)

C

E (x)

H (x)

I (x)

DFreachable Queue

C

E (x)

F

I (x)

Finalization Queue

Page 19: Deep Dumpster Diving

F

A

RootsRoots

C

E (x)

I (x)

D

E (x)

I (x)

Freachable Queue

C

F

Finalization Queue

Page 20: Deep Dumpster Diving

Optimizations Generations

Newly created objects tend to have short lives. The older an object is, the longer it will survive. Groups objects by age and collects younger objects more

frequently than older objects. All objects added to heap are in generation 0. When an object survives the first garbage collection it is promoted

to generation 1. When garbage collection is triggered survivors from generation 1

are promoted to generation 2 and generation 0 survivors are promoted to gen 1.

As objects "mature", they are moved to the next older generation until they reach gen 2.

Page 21: Deep Dumpster Diving

using System;using System.Collections.Generic;using System.Threading;using System.Runtime.CompilerServices;

public class MyClass{

static Byte[] bytes;public static void RunSnippet(){

Timer tmr = new Timer(M, null, 0, 1000);Thread.Sleep(20);for(int i = 0; i < 1000; i++)

bytes = new Byte[2000];

Console.ReadLine();}

static void M(object state){

Console.WriteLine("M - " + DateTime.Now);}

Demo 3 – WTF??

Page 22: Deep Dumpster Diving

Demo 4 (CLR Profile Word Count)

using System;using System.Collections.Generic;using System.Diagnostics;using System.IO;

public class MyClass{

public static void RunSnippet(){

while(true){

Stopwatch watch = new Stopwatch();watch.Start();StreamReader sr = new StreamReader(@"C:\Users\Ronn\Documents\My

Code Snippets\Garbage Collection\catcher.txt");string text = sr.ReadToEnd();int wordCount = text.Split().Length;Console.WriteLine("{0} Words", wordCount);watch.Stop();Console.WriteLine(watch.ElapsedMilliseconds + " Milliseconds");

}

}

Page 23: Deep Dumpster Diving
Page 24: Deep Dumpster Diving
Page 25: Deep Dumpster Diving
Page 26: Deep Dumpster Diving
Page 27: Deep Dumpster Diving
Page 28: Deep Dumpster Diving
Page 29: Deep Dumpster Diving

IDisposable public class MyClass : IDisposable

{

public void Dispose()

{

Dispose(true);

GC.SuppressFinalize(this);

}

protected virtual void Dispose(bool disposing)

{

if (!disposed)

{

if (disposing)

{

// Dispose managed

resources. Ex: Components.Dispose();

}

// Release ONLY unmanaged

resources. Ex: CloseHandle(handle);

}

disposed = true;

}

protected volatile bool disposed = false;

~MyClass()

{

Dispose(false);

}

}

[ComVisible(true)]

public interface IDisposable

{

void Dispose();

}

Page 30: Deep Dumpster Diving

Usingusing System;

using System.Collections.Generic;

using System.Diagnostics;

Page 31: Deep Dumpster Diving

Usingusing System;

using System.Collections.Generic;

using System.Diagnostics;

using (MyClass c = new MyClass())

{

//Do Some Work

}

Page 32: Deep Dumpster Diving

Demo 5 - optimizeusing System;using System.Collections.Generic;using System.Diagnostics;using System.IO;

public class MyClass{

public static void RunSnippet(){

while(true){

Stopwatch watch = new Stopwatch();watch.Start();using(StreamReader sr = new StreamReader(@"C:…Garbage Collection\

catcher.txt")){

string line = "";int wordCount = 0;while((line = sr.ReadLine()) != null){

wordCount += line.Split().Length;}Console.WriteLine("{0} Words", wordCount);

}watch.Stop();Console.WriteLine(watch.ElapsedMilliseconds + " Milliseconds");

}}

Page 33: Deep Dumpster Diving
Page 34: Deep Dumpster Diving

Total Relocated Final Gen 0 Gen 1 Large Object Heap6,578,038 96,608 5,057,272 1,400,580 12 3,535,4645,473,972 101,501 1,441,201 2,097,172 103,992 9,328======== ======== ======== ========= ======== ===========-1,104,066 +4,893 -3,617,071 +696,592 +103,980 -3,526,136

Page 35: Deep Dumpster Diving

Types of Memory LeaksManaged leaks – persistent object holds

a reference to an object expected to be garbage collected.

Unmanaged leaks - using unmanaged resources, dll’s or COM objects that leak memory.

Page 36: Deep Dumpster Diving
Page 37: Deep Dumpster Diving
Page 38: Deep Dumpster Diving
Page 39: Deep Dumpster Diving

Demo 7 - Leaky program?

Page 40: Deep Dumpster Diving
Page 41: Deep Dumpster Diving
Page 42: Deep Dumpster Diving
Page 43: Deep Dumpster Diving
Page 44: Deep Dumpster Diving
Page 45: Deep Dumpster Diving

public partial class ChildForm : Form { public ChildForm() { InitializeComponent(); }

private void ChildForm_Load(object sender, EventArgs e) { Program.Skin.PropertyChanged += new PropertyChangedEventHandler(Skin_PropertyChanged); }

void Skin_PropertyChanged(object sender, PropertyChangedEventArgs e) { this.BackColor = Program.Skin.BackgroundColor; this.label1.ForeColor = Program.Skin.ForegroundColor; } }

Page 46: Deep Dumpster Diving

public partial class ChildForm : Form { public ChildForm() { InitializeComponent(); }

private void ChildForm_Load(object sender, EventArgs e) { Program.Skin.PropertyChanged += new PropertyChangedEventHandler(Skin_PropertyChanged); }

void Skin_PropertyChanged(object sender, PropertyChangedEventArgs e) { this.BackColor = Program.Skin.BackgroundColor; this.label1.ForeColor = Program.Skin.ForegroundColor; }

protected override void OnClosing(CancelEventArgs e) { base.OnClosing(e); Program.Skin.PropertyChanged -= Skin_PropertyChanged; } }

Page 47: Deep Dumpster Diving

Contact & Reference Material http://msdn.microsoft.com/en-us/library/ms973837.aspx (Garbage

Collector Basics and Performance Hints) http://www.microsoft.com/downloads/details.aspx?FamilyID=a362781c

-3870-43be-8926-862b40aa0cd0&DisplayLang=en CLR Profiler for .Net 2.0 http://www.openasthra.com/multithreading/heap-overview/ Heap

Overview http://74.125.155.132/search?q=cache:44hDjSztDf4J:doc.bughunter.n

et/buffer-overflow/advanced-malloc-exploits.html+malloc+overview&cd=21&hl=en&ct=clnk&gl=us Advanced Malloc exploits

http://msdn.microsoft.com/en-us/magazine/cc534993.aspx http://www.microsoft.com/downloads/details.aspx?FamilyId=A362781

C-3870-43BE-8926-862B40AA0CD0&displaylang=en CLR Profiler

Ronn Black [email protected]