In Java löscht der Garbage Collector automatisch die nicht verwendeten Objekte, um den Speicher freizugeben. Entwickler müssen die Objekte nicht zum Löschen markieren, was fehleranfällig und anfällig für Speicherlecks ist. Es ist also sinnvoll, dass Java keine Destruktoren zur Verfügung hat.
Wenn die Objekte offene Sockets, geöffnete Dateien oder Datenbankverbindungen enthalten, kann der Garbage Collector diese Ressourcen nicht zurückfordern. Wir können die Ressourcen in der Close-Methode freigeben und die try-finally-Syntax verwenden, um die Methode anschließend vor Java 7 aufzurufen, z. B. die E / A-Klassen FileInputStream und FileOutputStream . Ab Java 7 können wir die Schnittstelle AutoCloseable implementieren und die try-with-resources-Anweisung verwenden, um kürzeren und saubereren Code zu schreiben. Es ist jedoch möglich, dass die API-Benutzer vergessen, die close-Methode aufzurufen, sodass die finalize-Methode und die Cleaner-Klasse als Sicherheitsnetz fungieren. Bitte beachten Sie jedoch, dass sie nicht dem Destruktor entsprechen.
Es ist nicht sichergestellt, dass sowohl die finalize-Methode als auch die Cleaner-Klasse sofort ausgeführt werden. Sie haben sogar keine Chance zu laufen, bevor die JVM beendet wird. Obwohl wir System nennen könnten.runFinalization Um vorzuschlagen, dass JVM die Finalize-Methoden aller Objekte ausführt, die zur Finalisierung anstehen, ist es immer noch nicht deterministisch. Darüber hinaus kann die Finalize-Methode Leistungsprobleme, Deadlocks usw. verursachen. Weitere Informationen finden Sie in einem unserer Artikel: Eine Anleitung zur Finalize-Methode in Java. Ab Java 9 wird die Klasse hinzugefügt, um die finalize Methode aufgrund ihrer Nachteile zu ersetzen. Dadurch haben wir eine bessere Kontrolle über den Faden, der die Reinigungsvorgänge ausführt. Die Java-Spezifikation weist jedoch auf das Verhalten von Reinigern während des Betriebs hin.exit ist implementierungsspezifisch und Java bietet keine Garantie, ob Reinigungsaktionen aufgerufen werden oder nicht.