39
Everything* you need to know about .NET Memory Ben Emmett – NDC London – 4th December 2014 *Most stuff

Net memory management ndc london

Embed Size (px)

Citation preview

Everything* youneed to know about

.NET Memory

Ben Emmett – NDC London – 4th December 2014

*Most stuff

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

public void CaffeineCheck(int coffeesConsumed)

{

int coffeesRequired = 3;

CaffeineAlert alert = new CaffeineAlert();

if (coffeesConsumed < coffeesRequired)

{

alert.Announce("Send help.");

}

}

CaffeineCheck (int coffeesRequired)

int coffeesRequiredint coffeesConsumed.....

[Return address]

The Stack

Alert()

CaffeineCheck()

ParentMethod()

For each thread

eg:

byteintcharPointers

Stack Heap

eg:

stringsclassesobjectsarrays

CaffeineCheck(int coffeesRequired)

int coffeesRequiredint coffeesConsumedCaffeineAlert alert

[Return address]

Stack

CaffeineAlertalert

public void CaffeineCheck(int coffeesConsumed)

{

int coffeesRequired = 3;

CaffeineAlert alert = new CaffeineAlert();

if (coffeesConsumed < coffeesRequired)

{

alert.Announce("Send help.");

}

}

CaffeineAlertalert

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;

}

List<Contact>Recipients

Contactlist

stringName

stringEmail

Contactlist

stringName

stringEmail

CaffeineCheck(int coffeesRequired)

int coffeesRequiredint coffeesConsumedCaffeineAlert alert

[Return address]

public class CaffeineAlert

{

private List<Contact> Recipients;

}

public class Contact

{

private string Name;

private string Email;

}

WRONG

HeapStack

CaffeineCheck(int coffeesRequired)

int coffeesRequiredint coffeesConsumedCaffeineAlert alert

[Return address]

public class CaffeineAlert

{

private List<Contact> Recipients;

}

public class Contact

{

private string Name;

private string Email;

}

WRONG

HeapStack

CaffeineCheck(int coffeesRequired)

int coffeesRequiredint coffeesConsumedCaffeineAlert alert

[Return address]

public class CaffeineAlert

{

private List<Contact> Recipients;

}

public class Contact

{

private string Name;

private string Email;

}

WRONG

HeapStack

CaffeineCheck(int coffeesRequired)

int coffeesRequiredint coffeesConsumedCaffeineAlert alert

[Return address]

public class CaffeineAlert

{

private List<Contact> Recipients;

}

public class Contact

{

private string Name;

private string Email;

}

WRONG

HeapStack

CaffeineAlertalert

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;

}

List<Contact>Recipients

Contactlist

stringName

stringEmail

Contactlist

stringName

stringEmail

CaffeineAlertalert

List<Contact>Recipients

String Name String EmailString NameString Email

Object reference

Stack

Object reference

Stack

Object reference

Stack

Object reference

Stack

The Heap

Small Object Heap (SOH)

Gen 2

Gen 1

Gen 0

Large Object Heap (LOH)

Address

1100k

1000k

900k

800k

700k

600k

500k

400k

300k

200k

100k

0

Address

1100k

1000k

900k

800k

700k

600k

500k

400k

300k

200k

100k

0

stringname

NaughtyStringMessage(string name)

ref string name

[Return address]

Stack Heap

public void NaughtyStringMessage(string name)

{

string message = "Hello ";

message += name;

Console.WriteLine(message);

}

1

2

3

4

5

6

"Ted"

stringname

Stack Heap

public void NaughtyStringMessage(string name)

{

string message = "Hello ";

message += name;

Console.WriteLine(message);

}

stringmessage

1

2

3

4

5

6

"Ted"

"Hello"

NaughtyStringMessage(string name)

ref string messageref string name

[Return address]

stringname

Stack Heap

public void NaughtyStringMessage(string name)

{

string message = "Hello ";

message += name;

Console.WriteLine(message);

}

stringmessage

1

2

3

4

5

6

stringmessage

"Ted"

"Hello"

"Hello Ted"

NaughtyStringMessage(string name)

ref string messageref string name

[Return address]

public static event EventHandler UserLoggedOut;

Main form

MainForm.UserLoggedOut += HideFormData;

Child form

MainForm

EventHandlerUserLoggedOut

ChildFormSecretDataWindow

Loads Of Other Junk

public class UnmanagedClass

{

~UnmanagedClass()

{

//Clear up the unmanaged resources

}

}

public class UnmanagedClass : IDisposable

{

public void Dispose()

{

//Clear up the unmanaged resources

GC.SuppressFinalize(this);

}

~UnmanagedClass()

{

this.Dispose();

}

} Not a complete IDisposable implementation

Questions?

[email protected] @bcemmett slideshare.net/benemmett