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

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

Embed Size (px)

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

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