Garbage Collection - inf-swe

Werbung
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
Herunterladen