5 Memory Leaks, die auch in Ihrer .NET Anwendung sein könnten

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

Transcript of 5 Memory Leaks, die auch in Ihrer .NET Anwendung sein könnten

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

reference

Stack Heap

Mark: Lebende Objekte Identifizieren

• Ausgehend von einer Wurzel• Statische Variable

• Lokale Variable

• Finalization Queue

Object

reference

Stack Heap

Mark: Lebende Objekte Identifizieren

Object

reference

Stack Heap

Sweep: Tote Objekte freigeben

Object

reference

Stack 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 unter

http://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!

Homepage

[email protected] | http://andrekraemer.de | http://andrekraemer.de/blog | http://github.com/AndreKraemer

Vielen Dank!

Blog

Xing

Facebook

Twitter

Google+

32

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

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

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

33