Nicht unter der Kontrolle des Benutzerprogramms sondern durch einen automatischen Garbage Collector.
Der weiß zur Laufzeit, welche Objekte existieren und prüft, auf welche Objekte nicht mehr verwiesen wird.
Technisch: Low-priority-thread, der im Hintergrund mitläuft. Nutzt z.B. die Zeiten des Wartens auf Benutzereingabe.
Hohe Priorität bekommt der Garbage Collector nur, wenn der Interpreter keinen Speicher mehr hat.
Für die Entsorgung von Objekten muß also nichts getan werden.
Ein Beispielfall, wo wir dem Garbage Collector helfen können:
public static void meth () { int big_array[] = new int[100000]; // rechne auf big_array int result = compute(big_array); // brauchen big_array nicht mehr // nach verlassen von meth kann es // entsorgt werden. // falls meth aber NICHT verlassen // wird: big_array = null; for (;;) // für immer handle_user_input(); }
Um die Freigabe der Ressource ``Speicher'' kümmert sich der Garbage Collector. Andere Ressourcen können in der finalizer-Methode freigegeben werden.
Hier ist die finalizer-Methode aus
java.io.FileOutputStream:
public void finalize() throws IOException; // overrides Object { // close the stream if (fd != null) close(); }
Regeln für Finalizer:
Grund: finalize-Methoden können Objekte ``wiederauferstehen''
lassen (z.B. durch Speichern des this-Zeigers).
GC muß also erneut prüfen.