Heim Java javaLernprogramm Einführung in Methoden zum Verbot der Verwendung von finalize in Java

Einführung in Methoden zum Verbot der Verwendung von finalize in Java

Oct 14, 2017 am 09:37 AM
finalize java 使用

In diesem Artikel wird hauptsächlich das Verbot der Verwendung der Finalize-Methode in Java vorgestellt. Freunde, die sie benötigen, können darauf verweisen.

Was ist die Finalize-Methode?

finalize Die ()-Methode ist in der Klasse Java.lang.Object definiert, was bedeutet, dass alle Klassen diese Methode überschreiben können. Der Java-Garbage Collector kann nur über new zugewiesenen Speicher freigeben. Wenn Ihr Objekt also kein über new erhaltener Speicher ist, weiß der Garbage Collector nicht, wie er den Speicher des Objekts freigeben soll.

Um mit dieser Situation umzugehen, erlaubt Java, dass die Methode finalize() in der Klasse java.lang.Object in der Klasse überladen wird.

So funktioniert es: Sobald der Garbage Collector bereit ist, den vom Objekt belegten Speicherplatz freizugeben, wird zuerst seine finalize()-Methode aufgerufen und der vom Objekt belegte Speicher wird erst tatsächlich zurückgefordert Die nächste Garbage-Collection-Aktion findet statt.

Aufrufmechanismus der Finalisierungsfunktion

Die Java Virtual Machine-Spezifikation legt nicht streng fest, ob und wie die Garbage Collection durchgeführt werden soll . Daher kann nicht garantiert werden, dass der hier erwähnte Aufrufmechanismus für alle JVMs geeignet ist.

Wann heißt es?

Wann wird finalize aufgerufen? Im Allgemeinen wird es möglicherweise erst aufgerufen, wenn die JVM mit der Speicherbereinigung beginnt. Der Zeitpunkt, zu dem die JVM die Speicherbereinigung durchführt, ist sehr ungewiss und hängt von verschiedenen Faktoren der Laufzeitumgebung ab. Gerade aufgrund der Ungewissheit der Aufrufzeit der Finalisierungsfunktion kommt es zu einigen der später erwähnten Mängel.

Wer ruft an?

Common JVM ruft die Finalize-Funktion über den GC-Garbage-Collection-Thread auf. Da der Garbage-Collection-Thread sehr wichtig ist (schließlich ist er auch ein integraler Bestandteil der JVM), führt der Garbage-Collection-Thread Folgendes aus, um zu verhindern, dass die von der Finalize-Funktion ausgelöste Ausnahme den Betrieb des Garbage Collection-Threads beeinträchtigt Versuchen Sie es beim Aufrufen jeder Finalisierungsfunktion mit Catch. Wenn eine Ausnahme abgefangen wird, wird sie direkt verworfen und dann wird die Finalisierungsfunktion des nächsten ungültigen Objekts verarbeitet.

Warum ist die Verwendung von finalize() verboten?

1. Die Aufrufzeit ist ungewiss – es besteht ein Risiko der Verschwendung von Ressourcen

Der Aufrufmechanismus wurde bereits eingeführt. Die Studierenden sollten sich der Tatsache bewusst sein, dass „der Zeitpunkt des Aufrufs von finalize sehr ungewiss ist“. Wenn Sie daher in finalize() einige knappe Ressourcen freigeben, kann dies dazu führen, dass die knappen Ressourcen sehr, sehr lange warten müssen, bevor sie freigegeben werden. Das ist eine Verschwendung von Ressourcen! Darüber hinaus verbrauchen die von bestimmten Klassenobjekten (z. B. einigen JDBC-Klassen) bereitgestellten Ressourcen möglicherweise selbst viel Speicher, und die verzögerte Freigabe dieser Ressourcen führt zu großen Leistungsproblemen.

2. Darf nicht aufgerufen werden - es besteht die Gefahr eines Ressourcenverlusts

Viele Studenten denken, dass finalize() immer aufgerufen wird, aber das ist nicht der Fall . In einigen Fällen wird finalize() überhaupt nicht aufgerufen. Wenn beispielsweise die JVM beendet wird, werden die Finalisierungsfunktionen dieser Objekte im Speicher möglicherweise nicht aufgerufen.

Vielleicht denken einige Studenten über „runFinalizersOnExit“ nach, um sicherzustellen, dass alle Finalisierungen aufgerufen werden, bevor die JVM beendet wird. Es ist schade und bedauerlich, dass diese Methode seit JDK 1.2 aufgegeben wurde. Auch wenn diese Methode nicht aufgegeben wird, birgt sie immer noch ein großes Risiko für die Thread-Sicherheit! ​

Wie oben zu sehen ist, ist es sehr schlecht, wenn Sie sich erst einmal auf finalize() verlassen, um Ressourcen freizugeben (es besteht die Gefahr eines Ressourcenverlusts)! Oftmals sind durch Ressourcenlecks verursachte Leistungsprobleme schwerwiegender und sollten nicht unterschätzt werden.

3. Das Objekt kann wiederbelebt werden, wenn die Finalisierungsfunktion aufgerufen wird.

Ursprünglich ruft der Garbage Collector nur auf, wenn ein Objekt abgelaufen ist (keine Referenzen). Objekt-Finalisierungsfunktion. Wenn Sie jedoch auf einen perversen Programmierer stoßen und die eigene Referenz des Objekts (d. h. diese) irgendwo in der finalize()-Funktion erneut speichern, ist dies gleichbedeutend damit, sich selbst wiederzubeleben (da das Objekt eine neue Referenz hat und sich nicht mehr in einem ungültigen Zustand befindet). Zustand). Um zu verhindern, dass diese seltsame Sache passiert, kann der Garbage Collector nur nach jedem Aufruf von finalize() prüfen, ob sich das Objekt noch in einem ungültigen Zustand befindet. Dadurch erhöht sich der Overhead der JVM praktisch. Erwähnen Sie es einfach beiläufig. Wie in der JDK-Dokumentation festgelegt, ruft die JVM finalize() höchstens einmal für jede Klassenobjektinstanz auf. Daher wird finalize() bei gefälschten Leichen nicht aufgerufen, wenn diese tatsächlich sterben. Kommt Ihnen das nicht seltsam vor?

4. Denken Sie daran, Ausnahmen selbst abzufangen

Ich habe gerade bei der Einführung des finalize()-Aufrufmechanismus erwähnt, dass dies der Fall sein wird, sobald eine Ausnahme außerhalb der Finalize-Funktion ausgelöst wird Vom Garbage-Collection-Thread abgefangen und verworfen. Mit anderen Worten, die Ausnahme wird ignoriert (die Gefahren ignorierter Ausnahmen werden „hier“ erwähnt). Um so etwas zu verhindern, müssen Sie eine Try-Catch-Anweisung für jeden Code schreiben, der in finalize() eine Ausnahme auslösen könnte, und diese selbst abfangen.

5. Achten Sie auf die Thread-Sicherheit

Da finalize() von einem Garbage-Collection-Thread aufgerufen wird, handelt es sich nicht um denselben Thread wie Ihr eigener Code. Selbst finalize() verschiedener Objekte kann von verschiedenen Garbage-Collection-Threads aufgerufen werden (z. B. bei Verwendung eines „Parallelsammlers“); Wann). Wenn Sie in finalize() auf bestimmte Daten zugreifen, müssen Sie daher immer auf Thread-Sicherheitsprobleme achten.

Zusammenfassung

Das obige ist der detaillierte Inhalt vonEinführung in Methoden zum Verbot der Verwendung von finalize in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Crossplay haben?
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Perfekte Zahl in Java Perfekte Zahl in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

Weka in Java Weka in Java Aug 30, 2024 pm 04:28 PM

Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

Smith-Nummer in Java Smith-Nummer in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

Fragen zum Java Spring-Interview Fragen zum Java Spring-Interview Aug 30, 2024 pm 04:29 PM

In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

Zeitstempel für Datum in Java Zeitstempel für Datum in Java Aug 30, 2024 pm 04:28 PM

Anleitung zum TimeStamp to Date in Java. Hier diskutieren wir auch die Einführung und wie man Zeitstempel in Java in ein Datum konvertiert, zusammen mit Beispielen.

Java -Programm, um das Kapselvolumen zu finden Java -Programm, um das Kapselvolumen zu finden Feb 07, 2025 am 11:37 AM

Kapseln sind dreidimensionale geometrische Figuren, die aus einem Zylinder und einer Hemisphäre an beiden Enden bestehen. Das Volumen der Kapsel kann berechnet werden, indem das Volumen des Zylinders und das Volumen der Hemisphäre an beiden Enden hinzugefügt werden. In diesem Tutorial wird erörtert, wie das Volumen einer bestimmten Kapsel in Java mit verschiedenen Methoden berechnet wird. Kapselvolumenformel Die Formel für das Kapselvolumen lautet wie folgt: Kapselvolumen = zylindrisches Volumenvolumen Zwei Hemisphäre Volumen In, R: Der Radius der Hemisphäre. H: Die Höhe des Zylinders (ohne die Hemisphäre). Beispiel 1 eingeben Radius = 5 Einheiten Höhe = 10 Einheiten Ausgabe Volumen = 1570,8 Kubikeinheiten erklären Berechnen Sie das Volumen mithilfe der Formel: Volumen = π × R2 × H (4

Wie führe ich Ihre erste Spring -Boot -Anwendung in der Spring Tool Suite aus? Wie führe ich Ihre erste Spring -Boot -Anwendung in der Spring Tool Suite aus? Feb 07, 2025 pm 12:11 PM

Spring Boot vereinfacht die Schaffung robuster, skalierbarer und produktionsbereiteter Java-Anwendungen, wodurch die Java-Entwicklung revolutioniert wird. Der Ansatz "Übereinkommen über Konfiguration", der dem Feder -Ökosystem inhärent ist, minimiert das manuelle Setup, Allo

See all articles