kcdc - .net memory management

37
Everything* you need to know about .NET Memory Ben Emmett - KCDC – 17 May 2014 *Most stuff

Upload: benemmett

Post on 15-May-2015

522 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: KCDC - .NET memory management

Everything* you need to know

about .NET MemoryBen Emmett - KCDC – 17 May 2014

*Most stuff

Page 2: KCDC - .NET memory management

Titanium Sponsors

Platinum Sponsors

Gold Sponsors

Page 3: KCDC - .NET memory management

Some of what I’m about to say is a lie*

*The good kind.

Page 4: KCDC - .NET memory management

public void CaffeineCheck(int coffeesConsumed){ CaffeineAlert alert = new CaffeineAlert(); int coffeesRequired = 3;  if (coffeesConsumed < coffeesRequired) { alert.Announce("Send help."); }}

Page 5: KCDC - .NET memory management

CaffeineCheck (int coffeesRequired)

int coffeesRequiredint coffeesConsumed.....

[Return address]

The Stack

Alert()

CaffeineCheck()

ParentMethod()

For each thread

Page 6: KCDC - .NET memory management

eg:

byteintcharPointers

Stack Heap

eg:

stringsclassesobjectsarrays

Page 7: KCDC - .NET memory management

CaffeineCheck(int coffeesRequired)

int coffeesRequiredint coffeesConsumedCaffeineAlert alert

[Return address]

Stack Heap

CaffeineAlert

Page 8: KCDC - .NET memory management

public class ValueTypeTest{ public void ValueTypes() { int a = 1; int b = a; b = 2; Console.WriteLine(a); // 1 }}

public class ReferenceTypeTest{ public void ReferenceTypes() { TestClass a = new TestClass(); a.Test = 1; TestClass b = a; b.Test = 2; Console.WriteLine(a.Test); // 2 }} public class TestClass{ public int Test;}

Value Type Reference Type

Page 9: KCDC - .NET memory management

CaffeineAlertalert

CaffeineCheck(int coffeesRequired)

int coffeesRequiredint coffeesConsumedCaffeineAlert alert

[Return address]

Stack Heap

public class CaffeineAlert{ private List<Contact> Recipients;} public class Contact{ private string Name; private string Email;}

List<Contact>Recipients

Contactlist

stringName

stringEmail

Contactlist

stringName

stringEmail

Page 10: KCDC - .NET memory management

CaffeineAlertalert

List<Contact>Recipients

Contactlist

stringName

stringEmail

Contactlist

stringName

stringEmail

Heap

CaffeineCheck(int coffeesRequired)

int coffeesRequiredint coffeesConsumedCaffeineAlert alert

[Return address]

Stack

public class CaffeineAlert{ private List<Contact> Recipients;} public class Contact{ private string Name; private string Email;}

WRONG

Page 11: KCDC - .NET memory management

CaffeineAlertalert

CaffeineCheck(int coffeesRequired)

int coffeesRequiredint coffeesConsumedCaffeineAlert alert

[Return address]

Stack Heap

public class CaffeineAlert{ private List<Contact> Recipients;} public class Contact{ private string Name; private string Email;}

List<Contact>Recipients

Contactlist

stringName

stringEmail

Contactlist

stringName

stringEmail

Page 12: KCDC - .NET memory management

CaffeineAlertalert

List<Contact>Recipients

Contactlist

stringName

stringEmail

Contactlist

stringName

stringEmail

Page 13: KCDC - .NET memory management

Object reference

Stack Heap

Page 14: KCDC - .NET memory management

Object reference

Stack Heap

Page 15: KCDC - .NET memory management

Object reference

Stack Heap

Page 16: KCDC - .NET memory management

Object reference

Stack Heap

Page 17: KCDC - .NET memory management

Gen 0 Gen 1 Gen 2

Page 18: KCDC - .NET memory management

Gen 0 Gen 1 Gen 2

Page 19: KCDC - .NET memory management

Gen 0 Gen 1 Gen 2

Page 20: KCDC - .NET memory management

Gen 0 Gen 1 Gen 2

Page 21: KCDC - .NET memory management

Gen 0 Gen 1 Gen 2

Page 22: KCDC - .NET memory management

Gen 0 Gen 1 Gen 2

Page 23: KCDC - .NET memory management

Gen 0 Gen 1 Gen 2

Page 24: KCDC - .NET memory management

Address range Dirty?

0-127

128-255

256-383

384-511 YES

512-639

640-767

768-895

896-1023

Page 25: KCDC - .NET memory management

The Heap

Small Object Heap (SOH)

Gen 2

Gen 1

Gen 0

Large Object Heap (LOH)

Page 26: KCDC - .NET memory management

LOH

Address

1100k

1000k

900k

800k

700k

600k

500k

400k

300k

200k

100k

0

Page 27: KCDC - .NET memory management

Allocate Remove

Stack Quick Quick

Small Object Heap Quick Slow(ish)

Large Object Heap Slow(ish) Quick(ish)

Page 28: KCDC - .NET memory management

stringname

NaughtyStringMessage(string name)

ref string name

[Return address]

Stack Heap

public void NaughtyStringMessage(string name){ string message = "Hello "; message += name; Console.WriteLine(message);}

123456

"Ted"

Page 29: KCDC - .NET memory management

stringname

Stack Heap

public void NaughtyStringMessage(string name){ string message = "Hello "; message += name; Console.WriteLine(message);}

stringmessage

123456

"Ted"

"Hello"

NaughtyStringMessage(string name)

ref string messageref string name

[Return address]

Page 30: KCDC - .NET memory management

stringname

Stack Heap

public void NaughtyStringMessage(string name){ string message = "Hello "; message += name; Console.WriteLine(message);}

stringmessage

123456

stringmessage

"Ted"

"Hello"

"Hello Ted"

NaughtyStringMessage(string name)

ref string messageref string name

[Return address]

Page 31: KCDC - .NET memory management

public static event EventHandler UserLoggedOut;

Main form

MainForm.UserLoggedOut += HideFormData;

Child form

Page 32: KCDC - .NET memory management

MainForm

EventHandlerUserLoggedOut

ChildFormSecretDataWindow

Loads Of Other Junk

Page 33: KCDC - .NET memory management

public class UnmanagedClass{ ~UnmanagedClass() { //Clear up the unmanaged resources }}

Page 34: KCDC - .NET memory management

public class UnmanagedClass : IDisposable{ public void Dispose() { //Clear up the unmanaged resources GC.SuppressFinalize(this); }  ~UnmanagedClass() { this.Dispose(); }}

Not a complete IDisposable implementation

Page 35: KCDC - .NET memory management

Most awesome

2013

Page 37: KCDC - .NET memory management

[email protected]

@bcemmett

slideshare.net/benemmett