Frage

Wenn ich anrufe finalize() auf einem Objekt aus meinem Programmcode, wird das JVM Führen Sie die Methode trotzdem erneut aus, wenn der Garbage Collector dieses Objekt verarbeitet?

Dies wäre ein ungefähres Beispiel:

MyObject m = new MyObject();

m.finalize();

m = null;

System.gc()

Wäre der explizite Aufruf dazu finalize() mach das JVMDer Garbage Collector soll das nicht ausführen finalize() Methode auf Objekt m?

War es hilfreich?

Lösung

Gemäß diesem einfachen Testprogramm ruft die JVM finalize() auch dann auf, wenn Sie es explizit aufgerufen haben:

private static class Blah
{
  public void finalize() { System.out.println("finalizing!"); }
}

private static void f() throws Throwable
{
   Blah blah = new Blah();
   blah.finalize();
}

public static void main(String[] args) throws Throwable
{
    System.out.println("start");
    f();
    System.gc();
    System.out.println("done");
}

Die Ausgabe ist:

Start
Abschluss!
Abschluss!
Erledigt

Jede Ressource da draußen sagt, dass finalize() niemals explizit aufgerufen und die Methode so gut wie nie implementiert werden soll, da es keine Garantien dafür gibt, ob und wann sie aufgerufen wird.Es ist besser, alle Ihre Ressourcen einfach manuell zu schließen.

Andere Tipps

Man muss den Garbage Collector (GC)-Workflow verstehen, um die Funktion von finalize zu verstehen.Durch den Aufruf von .finalize() wird weder der Garbage Collector aufgerufen, noch wird system.gc aufgerufen.Tatsächlich hilft finalize dem Codierer, die Referenz des Objekts als „nicht referenziert“ zu deklarieren.

GC erzwingt eine Unterbrechung des laufenden Betriebs von JVM, was zu einer Beeinträchtigung der Leistung führt.Während des Betriebs durchläuft GC alle referenzierten Objekte, beginnend mit dem Stammobjekt (Ihrem Hauptmethodenaufruf).Diese Unterbrechungszeit kann verkürzt werden, indem die Objekte manuell als nicht referenziert deklariert werden, da dadurch die Betriebskosten gesenkt werden, die entstehen, wenn die Objektreferenz durch die automatisierte Ausführung als veraltet erklärt wird.Durch die Deklaration von finalize() setzt der Programmierer den Verweis auf das Objekt auf veraltet, sodass der GC-Lauf beim nächsten Durchlauf der GC-Operation die Objekte durchsucht, ohne die Operationszeit zu verbrauchen.

Zitat:„Nachdem die Finalize-Methode für ein Objekt aufgerufen wurde, werden keine weiteren Maßnahmen ergriffen, bis die Java Virtual Machine erneut festgestellt hat, dass es keine Möglichkeit mehr gibt, auf dieses Objekt durch einen Thread zuzugreifen, der noch nicht gestorben ist, einschließlich möglicher.“ Aktionen anderer Objekte oder Klassen, die zur Fertigstellung bereit sind. An diesem Punkt kann das Objekt verworfen werden." aus dem Java API Doc auf java.Object.finalize();

Für eine detaillierte Erklärung können Sie auch Folgendes überprüfen: javabook.computerware

Die finalize-Methode wird von einer JVM nie mehr als einmal für ein bestimmtes Objekt aufgerufen.Sie sollten sich ohnehin nicht auf finalize verlassen, da es keine Garantie dafür gibt, dass es aufgerufen wird.Wenn Sie finalize aufrufen, weil Sie Bereinigungscode ausführen müssen, ist es besser, ihn in eine separate Methode einzufügen und explizit zu machen, z. B.:

public void cleanUp() {
  .
  .
  .
}

myInstance.cleanUp();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top