2 Idisposable BP Csharp Developers Slides
2 Idisposable BP Csharp Developers Slides
Elton Stoneman
geekswithblogs.net/eltonstoneman
@EltonStoneman
What is the How IDisposable Best Practice
Garbage Collector? works with the GC implementation of
IDisposable
— MSDN
Stack
App ends
GC runs
GC
Gen-0
Short-lived in gen-0
a1 a2 a3
Gen-1
Gen-2
GC
Gen-0
Short-lived in gen-0
a1 a2 a3
L
Gen-1
Move from gen-0 to gen-1
Gen-2
GC
Gen-0
Short-lived in gen-0
Gen-1
Move from gen-0 to gen-1
a1 a2
Gen-2
GC
Gen-0
Short-lived in gen-0
a4 a5 a6
Gen-1
Move from gen-0 to gen-1
a1 a2
Gen-2
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
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
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
AppDomain
Heap
AppDomain
Heap
AppDomain
Heap
{...} pointer
GC Runs
Deallocates objects
Large Object Heap
obj3
AppDomain
Heap
{...} pointer
GC Runs
Deallocates objects
Large Object Heap
Compresses Heap
obj3
AppDomain
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
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
Threshold GC App
Check Collects Continues
GC
App
App App
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
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
/* ... */
}
~ClassWithFinalizer() { /* ... */ }
o
Heap
obj1
L
~ClassWithFinalizer() { /* ... */ }
}
o
Heap
obj1
L
~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
}
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