garbage collection unter.net garbage collection optimierung finalization resurrection

22
Garbage Collection unter .NET Garbage Collection Optimierung Finalization Resurrection

Upload: ursel-wickland

Post on 06-Apr-2015

190 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Garbage Collection unter.NET Garbage Collection Optimierung Finalization Resurrection

Garbage Collection unter .NET

Garbage Collection

Optimierung

Finalization

Resurrection

Page 2: Garbage Collection unter.NET Garbage Collection Optimierung Finalization Resurrection

Vorteile von Garbage Collection

Kein explizites Freigeben von Speicher Beseitigung möglicher Fehlerquellen Keine Fragmentierung des Heaps Performance-Vorteil

- Garantierte „locality of reference“ bei Erzeugung- Durch Verdichtung des Heaps rücken langlebige

Objekte zusammen

Page 3: Garbage Collection unter.NET Garbage Collection Optimierung Finalization Resurrection

Mark & Compact

Markieren aller erreichbaren Objekte, Entfernen aller nicht markierten

Page 4: Garbage Collection unter.NET Garbage Collection Optimierung Finalization Resurrection

Mark & Compact

Verdichtung des Heaps, Neuberechnung der Zeiger (auch members)

Page 5: Garbage Collection unter.NET Garbage Collection Optimierung Finalization Resurrection

Optimierung durch Generationen

Für die meisten Applikationen gilt:- Je neuer ein Objekt, desto kürzer die Lebenszeit,

und je älter, desto länger wird die Lebenszeit sein- Neuere Objekte haben stärkere Beziehungen

untereinander und werden öfter verwendet

Und: Teile des Heaps zu bearbeiten ist effizienter als den gesamten zu verdichten

Optimierung durch differenzierte Behandlung von Objekten unterschiedlichen Alters

Page 6: Garbage Collection unter.NET Garbage Collection Optimierung Finalization Resurrection

Generationen

Neue Objekte sind „Generation 0“ Objekte, die einen GC-Lauf überleben, erreichen die

nächsthöhere Generation

Page 7: Garbage Collection unter.NET Garbage Collection Optimierung Finalization Resurrection

Generationen: Performance

GC kann Freigabe auf Generation 0 beschränken- Da neuere Objekte meist kurze Lebensdauer

haben, wird in Gen. 0 meist mehr Speicher freigegeben als in den anderen

Beschränkung der Mark-Traversierung- Innere Referenzen werden nur verfolgt bei

• neuen Objekten• alten Objekte, auf die seit der letzen Collection

geschrieben wurde

Page 8: Garbage Collection unter.NET Garbage Collection Optimierung Finalization Resurrection

Multi-Threading

Wenn GC eine Collection starten will, müssen alle Threads angehalten werden

Mechanismen- Fully interruptible code- Safe Points (vom JITC in Code eingefügt)

Für unmanaged code- „Hijacking“ um Thread anzuhalten- Thread kann während Collection weiterlaufen- „pinned objects“ erforderlich

Page 9: Garbage Collection unter.NET Garbage Collection Optimierung Finalization Resurrection

Finalization

Ressourcen müssen freigegeben werden- GC vergibt Speicher, gibt ihn wieder frei- aber nicht möglich für unbekannte Ressourcen

• Netzwerkverbindungen• Dateihandles• Datenbanken, etc.

Objekt kann durch Finalization Ressourcen freigeben, wenn es durch GC entfernt wird

Page 10: Garbage Collection unter.NET Garbage Collection Optimierung Finalization Resurrection

Finalization – Code Beispiel

Public class NetworkObj {

NetworkResource res;

Public NetworkObj() {

res = new NetworkResource();

}

...

~NetworkObj() {

res.close();

}

}

Page 11: Garbage Collection unter.NET Garbage Collection Optimierung Finalization Resurrection

Finalization: Behandlung

Enthält ein Objekt eine Finalize-Methode, wird ein Zeiger auf das Objekt in die Finalization Queue gestellt (bei Erzeugung des Objekts)

Page 12: Garbage Collection unter.NET Garbage Collection Optimierung Finalization Resurrection

Finalization: Behandlung

Wird ein Objekt als Garbage betrachtet, und befindet sich ein Zeiger darauf im Fin.-Queue, wird dieser in den „F-reachable Queue“ kopiert

Page 13: Garbage Collection unter.NET Garbage Collection Optimierung Finalization Resurrection

Finalization: Behandlung

Objekte im F-reachable Queue können noch NICHT freigegeben werden, da erst ihre Finalize-Methode aufgerufen werden muß

Page 14: Garbage Collection unter.NET Garbage Collection Optimierung Finalization Resurrection

Finalization: Behandlung

Separater Thread wird gestartet, der die Objekte im F-reachable Queue abarbeitet

Objekte können erst im nächsten GC-Lauf tatsächlich freigegeben werden!

Page 15: Garbage Collection unter.NET Garbage Collection Optimierung Finalization Resurrection

Finalization Nachteile

Erzeugung von Objekten mit Finalize-Methode dauert länger

Freigabe dauert länger (Aufrufe der Methoden erforderlich)

Speicher wird nicht sofort freigegeben Ist kein (deterministischer) Destruktor

- Darf nicht direkt aufgerufen werden- Zeitpunkt und Reihenfolge der Ausführung sind

willkürlich- Nur verwenden wenn wirklich nötig

Page 16: Garbage Collection unter.NET Garbage Collection Optimierung Finalization Resurrection

Dispose

Die meisten Ressourcen wollen möglichst früh wieder freigegeben werden

Unteilbare Ressourcen (z.B. Datei) können durch die Nicht-Vorhersagbarkeit des Freigabe-Zeitpunktes problematisch sein

Lösung:- (manuell aufrufbare) Freigabe-Methode- Finalize als Backup

Page 17: Garbage Collection unter.NET Garbage Collection Optimierung Finalization Resurrection

Dispose

In der Dispose-Methode kann durch System.GC.SuppressFinalize(this);

der Zeiger aus dem Finalization Queue entfernt werden, Finalize wird nicht aufgerufen

Vorteile:- Wird explizit Dispose() aufgerufen (Normalfall),

wird das Freigeben effizienter- Wird vergessen, gibt der GC die Ressourcen frei

Page 18: Garbage Collection unter.NET Garbage Collection Optimierung Finalization Resurrection

Resurrection

F-reachable Queue Zeiger werden als Wurzelzeiger aufgefaßt- D.h. das Objekt ist tot, wird in den Queue

verschoben und lebt wieder bis zur nächsten Collection (der Zeiger ist dann entfernt)

Objekt kann in Finalize eine globale oder statische Referenz auf sich selbst erzeugen- wird „resurrected“, da wieder erreichbar- Allerdings wird Finalize das nächste Mal nicht

mehr ausgeführt

Page 19: Garbage Collection unter.NET Garbage Collection Optimierung Finalization Resurrection

Resurrection

Nutzen von Resurrection- z.B. für Objekt-Pool- hilfreich für Objekte mit zeitintensiven

Konstruktoren (z.B. Datenbankverbindung)

Im Normalfall nicht verwenden, da schwer zu durchschauen

Page 20: Garbage Collection unter.NET Garbage Collection Optimierung Finalization Resurrection

WeakReference

Direkte Referenzen sind „strong references“ „weak references“ für Objekte, die man

später zwar wieder braucht, die das System aber bei Bedarf freigeben darf

sr = new SomeObject();

WeakReference wr = new WeakReference(sr);

sr = null;

...

sr = (SomeObject)wr.Target;

if (sr==null) sr = new SomeObject();

Page 21: Garbage Collection unter.NET Garbage Collection Optimierung Finalization Resurrection

Direkte Interaktion mit dem GC

System.GC.Collect();

System.GC.Collect(int generation);

System.GC.GetGeneration(object);

System.GC.GetTotalMemory();

System.GC.KeepAlive(object);

System.GC.SuppressFinalize(object);

System.GC.ReRegisterForFinalize(object);

System.GC.WaitForPendingFinalizers();

Page 22: Garbage Collection unter.NET Garbage Collection Optimierung Finalization Resurrection

Literatur

- http://msdn.microsoft.com/library/default.asp?url=/msdnmag/issues/1100/GCI/TOC.ASP

- http://msdn.microsoft.com/msdnmag/issues/1200/GCI2/default.aspx

- Kevin Burton: .NET Common Language Runtime Unleashed, Sams Publishing 2002

- Dave Stutz, Ted Neward, Geoff Shilling: Shared Source CLI Essentials. O'Reilly 2003