5 Memory Leaks, die auch in Ihrer.NET Anwendung sein könnten André Krämer Softwareentwickler,...

Preview:

Citation preview

Danke, dass Sie alle gekommen sind!

Ich habe bereits beim Titel meiner Session gelogen!

Klassisches Memory Leak

int *array = malloc(sizeof(int) * 100); memset(array,0,sizeof(int) * 100); // use the array

// free(array) // ups, vergessen

Klassisches Memory Leak

int *array = malloc(sizeof(int) * 100); memset(array,0,sizeof(int) * 100); // use the array

// free(array) // ups, vergessen

Bild: © iStock.com/matt_benoit

Bild: © iStock.com/eric1513

Wie funktioniert eigentlich der Garbage Collector?

* Darstellung nicht 100 % korrekt, dafür aber verständlich ;-)

Der CLR garbage collector (GC) ist ein “almost-concurrent,

parallel, compacting, mark-and-sweep, generational, tracing GC”

?

Object referenceStack Heap

Mark: Lebende Objekte Identifizieren

• Ausgehend von einer Wurzel• Statische Variable• Lokale Variable• Finalization Queue

Object referenceStack Heap

Mark: Lebende Objekte Identifizieren

Object referenceStack Heap

Sweep: Tote Objekte freigeben

Object referenceStack Heap

Compact: Objekte zusammen führen

Mark – Sweep – Compact ist performancelastig

Gen 0 Gen 1 Gen 2

Generational Garbage Collection (Gen 0 Collection: Start)

Gen 0 Gen 1 Gen 2

Generational Garbage Collection (Gen 0 Collection: Ende)

Gen 0 Gen 1 Gen 2

Generational Garbage Collection (Next Gen 0 Collection: Start)

Gen 0 Gen 1 Gen 2

Generational Garbage Collection (Next Gen 0 Collection: Ende)

Gen 0 Gen 1 Gen 2

Generational Garbage Collection (Gen 1 Collection: Start)

Gen 0 Gen 1 Gen 2

Generational Garbage Collection (Next Gen 0 Collection: Start)

Gen 0 Gen 1 Gen 2

Generational Garbage Collection (Next Gen 0 Collection: Ende)

Warum geht trotzdem noch was schief?

a) Weil Ihr Kollege was falsch gemacht hat

Bild: © iStock.com/NinaMalyna

b) Weil Microsoft was falsch gemacht hat

Bild: © iStock.com/ThomasTroy

Wie finden wir unser Leak?

Besser: Ein Memory Profiler

DemoMemoy Leaks unter .NET finden

Source Code unterhttp://github.com/AndreKraemer

Fazit

•Melden Sie Event Handler auf länger lebende Objekte ab•Meiden Sie statische Dictionaries als Cache•Reduzieren Sie die Anzahl dynamisch generierter Assemblies durch Caching oder ähnliches• Implementieren Sie INotifyPropertyChanged wenn Sie Databinding nutzen•Blockieren Sie den Finalizer nicht!

32

Homepage

andre@andrekraemer.de | http://andrekraemer.de | http://andrekraemer.de/blog | http://github.com/AndreKraemer

Vielen Dank!

Blog

Xing

Facebook

Twitter

Google+

Vielen Dank an Ben Emmett von Redgate Software für die Unterstützung bei den Folien

Sämtliche Abbildung wurden ordnungsgemäß bei IStockPhoto lizensiert.

33

Meine Dienstleistungen

• Schulungen• ASP.NET• Xamarin• TX Text Control• Infragistics NetAdvantage• Team Foundation Server

• Consulting• Durchführung von Technologieworkshops• Code- / Architekturreviews• Analyse von managed Memory Leaks• Prototypenentwicklung• Remote Entwickler-Support• Projektbegleitendes Coaching

• Softwareentwicklung• Mobile Apps (Windows 8, Windows Phone, Android, iOS)• Entwicklung von Web-Anwendungen

Recommended