0% found this document useful (0 votes)
15 views

2 Idisposable BP Csharp Developers Slides

Uploaded by

Iulian Sirbu
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
15 views

2 Idisposable BP Csharp Developers Slides

Uploaded by

Iulian Sirbu
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 49

What Happens When the

Garbage Collector Runs?

Elton Stoneman
geekswithblogs.net/eltonstoneman
@EltonStoneman
What is the How IDisposable Best Practice
Garbage Collector? works with the GC implementation of
IDisposable

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
The .NET Framework's garbage
collector manages the allocation
and release of memory for your
application

— MSDN

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
GC 101

var obj = new MayUseUnmanagedResources();

AppDomain App creates instance


Heap

Stack

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
GC 101

var obj = new MayUseUnmanagedResources();

AppDomain App creates instance


Heap
obj1
Stack .NET allocates memory
{...} pointer

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
GC 101

AppDomain App creates instance


Heap
obj1
Stack .NET allocates memory
{...} pointer
App ends

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
GC 101

App creates instance

.NET allocates memory

App ends

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
GC 101

AppDomain App creates instance


Heap
obj1
Stack L .NET allocates memory
{...} pointer
GC runs

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
GC 101

AppDomain App creates instance


Heap
obj1
Stack L .NET allocates memory
{...} pointer
GC runs

Deallocates dead objects

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
GC 101

AppDomain App creates instance


Heap

Stack .NET allocates memory

GC runs

Deallocates dead objects

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
GC Generations

GC
Gen-0
Short-lived in gen-0
a1 a2 a3

Gen-1

Gen-2

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
GC Generations

GC
Gen-0
Short-lived in gen-0
a1 a2 a3
L
Gen-1
Move from gen-0 to gen-1

Gen-2

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
GC Generations

GC
Gen-0
Short-lived in gen-0

Gen-1
Move from gen-0 to gen-1
a1 a2

Gen-2

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
GC Generations

GC
Gen-0
Short-lived in gen-0
a4 a5 a6

Gen-1
Move from gen-0 to gen-1
a1 a2

Gen-2

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
GC Generations

GC
Gen-0
Short-lived in gen-0
a4 a5 a6
L L
Gen-1
Move from gen-0 to gen-1
a1 a2
L Move from gen-1 to gen-2
Gen-2

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
GC Generations

GC
Gen-0
Short-lived in gen-0

Gen-1
Move from gen-0 to gen-1
a4
Move from gen-1 to gen-2
Gen-2
a1

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
GC Generations

GC
Gen-0
Short-lived in gen-0
a7 a8 a9

Gen-1
Move from gen-0 to gen-1
a4
Move from gen-1 to gen-2
Gen-2
a1
Minimizing GC workload

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
Heap Compression

AppDomain
Heap

Stack Heap Large object heap


obj1
{...} pointer
{...} pointer
{...} pointer

Large Object Heap


obj2 obj3

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
Heap Compression

AppDomain
Heap

Stack Heap Large object heap


obj1
{...} pointer L GC Runs
{...} pointer
{...} pointer

Large Object Heap


obj2 obj3
L
Do Not Place Anything
in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
Heap Compression

AppDomain
Heap

Stack Heap Large object heap

{...} pointer
GC Runs

Deallocates objects
Large Object Heap
obj3

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
Heap Compression

AppDomain
Heap

Stack Heap Large object heap

{...} pointer
GC Runs

Deallocates objects
Large Object Heap
Compresses Heap
obj3

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
Heap Compression

AppDomain
Heap

Stack Heap Large object heap

{...} pointer
GC Runs

Deallocates objects
Large Object Heap
Compresses Heap
obj3
Not Large Object Heap
Do Not Place Anything
in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
Balancing Concerns

Memory Collections

Available Infrequently

Contiguous Efficiently

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
When Does the GC Collect?

Gen-0
Threshold
Gen-0 Threshold Gen-1 Threshold Gen-2 Threshold
Gen-1 Threshold Gen-2 Threshold

Generation 0 collection +
Generation 1 collection +
Generation 0 collection +
Generation-0
Generation 0
collection Generation-1
Generation 1 collection Generation-2
Generation 2 collection

Collection Collection Collection


Do Not Place Anything
in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
How Does the GC Run?

Threshold GC App
Check Collects Continues

GC
App
App App

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
Demo 1: Profiling DatabaseState

Goal Walkthrough Walkthrough


Demonstrate Profile memory Force garbage
object allocation usage for app collection and
and GC collection using show memory
DatabaseState usage

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
Demo 1: Profiling DatabaseState

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
Demo 1: Profiling DatabaseState

private static DatabaseState _DatabaseState;

3500

3000

2500

2000

1500

1000

500

0
Startup First Run Multiple Runs GC.Collect
Do Not Place Anything
in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
Demo 1: Profiling DatabaseState

var databaseState = new DatabaseState();

4500

4000

3500

3000

2500

2000

1500

1000

500

0
Startup First Run Multiple Runs GC.Collect
Do Not Place Anything
in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
Demo 1: Profiling SqlConnection

4500

4000

3500

3000

2500

2000

1500

1000

500

0
Startup First Run Multiple Runs GC.Collect
Do Not Place Anything
in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
Demo 2: Implementing IDisposable

Goal Walkthrough Walkthrough


Show correct Implement Run under
implementation IDisposable using memory profiler
of IDisposable standard pattern and show memory
usage

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
Demo 2: Implementing IDisposable

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
Demo 2: Implementing IDisposable

public class DatabaseState : IDisposable


{
private SqlConnection _connection;

/* ... */

public void Dispose()


{
_connection.Close();
_connection.Dispose();
}
}

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
Best Practice #2
If you use IDisposable
objects as instance fields,
implement IDisposable

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.

Best Practice #2

public class DatabaseState : IDisposable


{
private SqlConnection _connection;

public void Dispose()


{
Dispose(true);
GC.SuppressFinalize(this);
}

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
{
if (disposing)
{
Best Practice #2

protected virtual void Dispose(bool disposing) ✮


if (_connection != null)
{
_connection.Dispose();
_connection = null;
}
}
}

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
Best Practice #3
Allow Dispose() to be called
multiple times and don't
throw exceptions

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.

Best Practice #3

protected virtual void Dispose(bool disposing)


{
if (disposing)
{
if (_connection != null)
{
_connection.Dispose();
_connection = null;
}
}
}

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
Dispose and Finalize

public class ClassWithFinalizer : IDisposable


{
public void Dispose() { /* ... */ }

}
~ClassWithFinalizer() { /* ... */ }


o
Heap
obj1
L

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
Dispose and Finalize

public class ClassWithFinalizer : IDisposable


{
public void Dispose() { /* ... */ }

~ClassWithFinalizer() { /* ... */ }
}


o
Heap
obj1
L

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
Demo 3: Dispose and Finalize

Goal Walkthrough Walkthrough


Show correct Clean up managed Clean up
implementation resources when unmanaged
of Dispose and disposing in the resources in the
Finalize derived class finalizer

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
Demo 3: Dispose and Finalize

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
Demo 3: Dispose and Finalize

public class UnmanagedDatabaseState : DatabaseState


{
private SqlCommand _command;
private IntPtr _unmanagedPointer;

protected override void Dispose(bool disposing)


{
if (disposing && _command != null)
{
_command.Dispose();
_command = null;
}
//unmanaged resources...
base.Dispose(disposing);
}
Do Not Place Anything
in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
Demo 3: Dispose and Finalize

protected override void Dispose(bool disposing)


{
//managed resources...
if (_unmanagedPointer != IntPtr.Zero)
{
Marshal.FreeHGlobal(_unmanagedPointer);
_unmanagedPointer = IntPtr.Zero;
}
base.Dispose(disposing);
}

~UnmanagedDatabaseState()
{
Dispose(false);
}
Do Not Place Anything
in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
Best Practice #4
Implement IDisposable to
support disposing resources
in a class hierarchy

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
Best Practice #4

public class DatabaseState : IDisposable

public void Dispose()



{
Dispose(true);
GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool disposing)

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
Best Practice #5
If you use unmanaged
resources, declare a finalizer
which cleans them up

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
{

}
Dispose(false);
Best Practice #5

~UnmanagedDatabaseState() ✮
protected override void Dispose(bool disposing)
{
//managed resources...
if (_unmanagedPointer != IntPtr.Zero)
{
Marshal.FreeHGlobal(_unmanagedPointer);
_unmanagedPointer = IntPtr.Zero;
}
base.Dispose(disposing);
}
Do Not Place Anything
in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.
Summary

 What does the Garbage Collector do? 


 Keeping available memory free
 Without impacting performance

 When the GC runs 


 When it decides to
 Could have build-up of dead objects

 Implementing IDisposable  What Happens


 Disposing managed resources if you don't
 Expecting Dispose to be repeatedly called Dispose?
 Allowing inheritors to dispose their resources
 Using finalizers to clean up unmanaged resources

Do Not Place Anything


in This Space
(Add watermark during
editing)
Note: Warning will not appear
during Slide Show view.

You might also like