Deep Dumpster Diving
description
Transcript of Deep Dumpster Diving
DEEP DUMPSTER DIVING
A close look at .Net garbage collection
Ronn Black
October 2009
Why should I care?
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");
}
}
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
Unmanaged Memory Management
Unused AreaHi Address
Low Address
ReservedReserved
Args & VariablesArgs & Variables
StackStack
HeapHeap
Stack PointerUnused Area
NextObjPtr
NextObjPtr
RootsRoots
NextObjPtr
RootsRoots
NextObjPtr
~MyClass(){
//Do work here…}
MyClass.Finalize(){
//Do work here…}
=
Finalizers
RootsRoots
F
G
A
B
C
E
H
I
DFreachable Queue
C
E
F
I
Finalization Queue
F
G (x)
A
RootsRoots
B (x)
C
E (x)
H (x)
I (x)
DFreachable Queue
C
E (x)
F
I (x)
Finalization Queue
F
A
RootsRoots
C
E (x)
I (x)
D
E (x)
I (x)
Freachable Queue
C
F
Finalization Queue
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.
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??
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");
}
}
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();
}
Usingusing System;
using System.Collections.Generic;
using System.Diagnostics;
Usingusing System;
using System.Collections.Generic;
using System.Diagnostics;
using (MyClass c = new MyClass())
{
//Do Some Work
}
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");
}}
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
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.
Demo 7 - Leaky program?
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; } }
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; } }
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]