Garbage Collection Arthur Zaczek Apr 2015 Garbage Collection 1 dispose() 1.1 • • • • • • • • • • 1.2 Was passiert mit Hauptspeicher Datenbankverbindungen FileHandle Graphics Objekte Graphics Fonts Farben FileWatcher Sockets etc. Garbage Collection • Der GC kennt alle Objekte • Der GC kennt alle Referenzen auf Objekte • Objekte, auf die keine Referenz mehr zeigt können freigegeben werden 1.3 GC – Root Referenzen • Stack • Statische Variablen/Objekte • etc. • Diese werden niemals Freigeben, es sei denn, die Referenz wird gelöscht • Es kommt immer wieder vor, dass Objekte in Caches (=statische Variable) „vergessen“ werden 1.4 • • • • 1.5 GC – Objekte freigeben Wenn der GC Objekte gefunden hat, die er freigeben kann, so merkt er sich diese nur Erst ein einem späteren Prozess werden diese gelöscht! Wann dieses geschieht, ist undefiniert! Beim Löschen werden die Finalizer aufgerufen, d.H. erst jetzt können Ressourcen freigegeben werden GC - Ablauf • Die Zeitpunkte sind undefiniert! 1 Garbage Collection 1.6 GC - Finalize public class File { public void close() { if (file != null) { file.close(); file = null; } } protected void finalize() { try { close(); } finally { super.finalize(); } } } 1.7 GC - CS Dispose pattern public class SomeClass: IDisposable { private bool disposed = false; public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (!disposed) { if (disposing) { // Free other state (managed objects). } // Free your own state (unmanaged objects). disposed = true; } } ~SomeClass() { Dispose (false); } } 1.8 GC - Finalize • Der Zeitpunkt des Entfernens nicht bekannt • Die Reihenfolge des Entfernens ebensowenig • -> Daher: Immer close(), dispose(), etc. aufrufen, wenn Objekte nicht mehr benötigt werden • Der Rest wird vom GC erledigt 2 Garbage Collection 1.9 GC - Aufräumen Java: File f = new File(); try { f.open(); f.read(); f.write(); } finally { f.close(); } 1.10 GC - Aufräumen II Java: try (File f = new File()) { f.open(); f.read(); f.write(); } // f.close(); 1.11 GC - Aufräumen III C#: using (File f = new File()) { f.Open(); f.Read(); f.Write(); } // f.Close(); 1.12 • • • • • 1.13 GC - Generationen Zur Optimierung der Performance werden Objekte in Generationen eingeteilt. Wenn ein Objekt einen GC Lauf überlebt, steigt es in der Generation Java kennt zwei Generationen, .NET 3 Je älter ein Objekt ist, desto unwahrscheinlicher ist es, dass der GC die Objekte behandelt -> Langlebige Objekte werden seltener freigegeben Strings • Strings sind immutable • d.H. jede String-Operation erzeugt einen neuen String 3 Garbage Collection • d.H. im Hautpspeicher gibt es sehr viele Strings, die vom GC gelöscht werden müssen • -> StringBuilder benutzen (Java & C#) 4