Ich muss wissen, wann die [finalize()
](https://docs.oracle.com/javase/10/docs/api/java/lang/Object.html#finalize()) Methode wird in der JVM
. Ich habe eine Testklasse erstellt, die in eine Datei schreibt, wenn die finalize()
Methode aufgerufen wird, indem sie überschrieben wird. Sie wird nicht ausgeführt. Kann mir jemand den Grund dafür nennen, warum sie nicht ausgeführt wird?
Antworten
Zu viele Anzeigen?Java ermöglicht es, Objekte zu implementieren zu implementieren, die aufgerufen werden kann.
finalize()-Methode wird aufgerufen, wenn der Garbage Collector versucht das Objekt zu sammeln.
Wenn der Garbage Collector nicht ausgeführt wird, wird die Methode nicht aufgerufen.
Wenn der Garbage Collector das Objekt nicht einsammeln kann und versucht, die wiederholen, wird die Methode beim zweiten Mal nicht mehr aufgerufen.
In der Praxis ist es sehr unwahrscheinlich, dass Sie sie in realen Projekten verwenden werden.
Denken Sie daran, dass sie möglicherweise nicht angerufen wird und dass sie definitiv nicht zweimal aufgerufen wird. Die finalize()-Methode kann null oder einmal Mal ausgeführt werden.
Im folgenden Code erzeugt die finalize()-Methode kein ou wenn wir sie ausführen, da das Programm beendet wird, bevor es notwendig ist, die Garbage Collector auszuführen.
Wie bereits in https://wiki.sei.cmu.edu/confluence/display/java/MET12-J.+Nicht+Verwendung+von+Endverschlüssen ,
Es gibt keinen festen Zeitpunkt, zu dem Finalizer ausgeführt werden müssen, da der Zeitpunkt der Ausführung von der Java Virtual Machine (JVM) abhängt. Die einzige Garantie ist, dass jede Finalizer-Methode, die ausgeführt wird, dies irgendwann tut, nachdem das zugehörige Objekt unerreichbar geworden ist (festgestellt während des ersten Zyklus der Garbage Collection) und bevor der Garbage Collector den Speicher des zugehörigen Objekts zurückfordert (während des zweiten Zyklus des Garbage Collectors). Die Ausführung des Finalizers eines Objekts kann beliebig lange verzögert werden, nachdem das Objekt unerreichbar geworden ist. Folglich ist das Aufrufen zeitkritischer Funktionen wie das Schließen von Datei-Handles in der finalize()-Methode eines Objekts problematisch.
Versuchen Sie, dieses Programm zum besseren Verständnis auszuführen
public class FinalizeTest
{
static {
System.out.println(Runtime.getRuntime().freeMemory());
}
public void run() {
System.out.println("run");
System.out.println(Runtime.getRuntime().freeMemory());
}
protected void finalize() throws Throwable {
System.out.println("finalize");
while(true)
break;
}
public static void main(String[] args) {
for (int i = 0 ; i < 500000 ; i++ ) {
new FinalizeTest().run();
}
}
}
- See previous answers
- Weitere Antworten anzeigen