Da Java eine sichere Sprache und Plattform ist, wird der Speicher nicht freigegeben. Auch die zugehörigen PhantomReference
s werden nicht in ihre ReferenceQueue
s eingereiht. Die VM ruft nur einmal finalize
für ein Objekt auf. Es gibt ein nettes Zustandsdiagramm in der JVM-Spezifikation.
Wenn Sie einen Finalisierer verwenden, sollten Sie die Deklaration normalerweise als @Override protected void finalize() throws Throwable
belassen, um die API nicht zu stören. Verwenden Sie besser einen abgeschirmten Finalisierer, wie in Effective Java 1st Ed.
Dieser besondere Trick traf die Schlagzeilen (der San Jose Mercury, überhaupt), als eine Gruppe in Princeton es verwendete, um eine benutzerdefinierte ClassLoader
aus nicht vertrauenswürdigen Code zu konstruieren. Obwohl die Spezifikation leicht verschärft wurde (der Object
-Konstruktor muss die Ausführung normal beenden, bevor der Finalisierer aufgerufen werden kann - angegeben in J2SE 5.0, implementiert in Java SE 6), bleibt dies ein Problembereich. Wenn Sie eine API entwerfen, stellen Sie sicher, dass sensible Klassen keine Unterklassen sein können, und ersparen Sie sich viel Kummer.
+1, weil es eine gute Frage ist, aber ich hoffe, das war nur eine intellektuelle Übung. ;) –
mach dir keine Sorgen, es war :) –