Java Cleaner-Klasse
java.lang.ref.Cleanerist ein in Java 9 eingeführtes Werkzeug, das zur Verwaltung der Objektbereinigung dient und eine sichere Möglichkeit bietet, Ressourcen während der Garbage Collection aufzuräumen. Es kann ersetzenfinalizedie Methode, die externe Ressourcen freigibt, indem sie Bereinigungsvorgänge ausführt, wenn das Objekt nicht mehr verwendet wird, und istfinalizeeffizienter und zuverlässiger.
1. CleanerRolle
CleanerErmöglicht uns, eine Bereinigungsaktion zu registrieren, die automatisch ausgeführt wird, wenn das Objekt unerreichbar wird (d. h., kurz davor, von der Garbage Collection erfasst zu werden). Typische Anwendungsszenarien umfassen:
- Automatisches Freigeben von Nicht-Java-Speicherressourcen, wie das Schließen von Dateien, Datenbankverbindungen, Socket-Verbindungen usw.
- Ersetzen
finalize, automatische Ressourcenfreigabe implementieren, Ressourcenlecks vermeiden, die durch vergessenes Aufrufen verursacht werdenclose()die Methode.
2. CleanerGrundlegende Verwendung
Das Folgende istCleanerdie grundlegende Verwendung:
- Erstelle
Cleanerein Beispiel:Cleaner.create()。 - Erstellen Sie ein Objekt, das bereinigt werden muss, und registrieren Sie es zusammen mit der Bereinigungsaktion bei
Cleanerdem Cleaner. Wenn das Objekt nicht mehr referenziert wird, wird die Bereinigungsaktion automatisch ausgeführt.
3. Verwendungsbeispiel
Das folgende Beispiel zeigt die VerwendungCleanerum eine Ressource zu erstellen, die bereinigt werden muss, und automatisch Bereinigungsaktionen auszuführen, wenn das Objekt unerreichbar wird:
Beispiel
public class CleanerExample {
// Eine Cleaner-Instanz erstellen
private static final Cleaner cleaner = Cleaner.create();
// Eine Ressource definieren, die bereinigt werden muss
static class Resource implements AutoCloseable {
// Bereinigungsaufgabe – wird zum Freigeben von Ressourcen verwendet
private final Cleaner.Cleanable cleanable;
Ressource() {
// Bereinigungsaufgabe registrieren; Bereinigungsaktion ausführen, wenn die Resource-Instanz unerreichbar wird
this.cleanable = cleaner.register(this, new ResourceCleaner());
System.out.println("Ressource initialisiert");
}
// Ressourcen aufräumen
private static class ResourceCleaner implements Runnable {
@Override
public void run() {
System.out.println("Ressource wird aufgeräumt...");
}
}
@Override
public void close() {
// Ressourcen aktiv freigeben und die beim Cleaner registrierte Aufräumaufgabe abbrechen
cleanable.clean();
System.out.println("Ressource geschlossen");
}
}
public static void main(String[] args) {
// Ressourcen verwenden
try (Resource resource = new Resource()) {
System.out.println("Ressource wird verwendet...");
} // close() automatisch aufrufen, um Ressourcen manuell aufzuräumen
// Wenn close() nicht aufgerufen wird, führt GC die Bereinigungsaufgabe aus
new Resource(); // close() nicht aufrufen, warten, dass GC die Bereinigung auslöst
System.gc(); // GC zum Ausführen anregen (Bereinigung wird nicht garantiert sofort ausgeführt)
}
}
4. Code-Erklärung
- Cleaner-Instanz:
Cleaner.create()erstellt eineCleanerInstanz, die verwendet wird, um Ressourcen zu registrieren, die bereinigt werden müssen. - Bereinigungsaufgabe registrieren:In
Resourceder Klasse, rufen Siecleaner.register(this, new ResourceCleaner())um das aktuelle Objekt beiCleanerdem Cleaner zu registrieren, wobei die Bereinigungsaufgabe angegeben wirdResourceCleaner。 - Automatische Bereinigung:Wenn das
ResourceInstanz hat keine anderen starken Referenzen und steht kurz davor, durch die Garbage Collection erfasst zu werden,CleanerCleaner wird automatischResourceCleaner.run()close() aufrufen und "Cleaning up resource..." ausgeben. - Manuelle Bereinigung:Durch
close()aktives Aufrufen der Methodecleanable.clean(), sofort Ressourcen bereinigen undCleanerdie Cleaner-Aufgabe abbrechen.
5. Eigenschaften und Vorteile von Cleaner
- Effizient:
CleanerVon der JVM verwaltet, vermeidet erfinalizedie ineffizienten Performance-Probleme. - finalize-Verzögerung vermeiden:
CleanerRegistrierte Aufgaben können unverzüglich ausgeführt werden, nachdem das Objekt unerreichbar geworden ist, anstatt auf einen verzögerten Aufruf durch den Garbage Collector zu warten. - Steuerbarkeit:
CleanerErmöglicht das aktive Aufrufenclean()um Ressourcen freizugeben, und bricht die Aufgabe nach der Bereinigung automatisch ab, wodurch doppelte Bereinigung vermieden wird. - Speicher- und Ressourcensicherheit: Reduziert das Risiko der manuellen Ressourcenverwaltung und gewährleistet die korrekte Freigabe von Systemressourcen.
6. Anwendungsszenarien von Cleaner
CleanerGeeignet für die Verwaltung von Ressourcen, die automatisch freigegeben werden müssen, insbesondere wenntry-with-resourcesdie Verwendung nicht möglich ist. Im Folgenden werden typische Anwendungsszenarien beschrieben:
- Native Ressourcen: Wird zur Verwaltung von Nicht-Heap-Speicherressourcen verwendet, wie z. B.
DirectByteBuffer, JNI oder andere lokale Ressourcen. - Cache-Bereinigung: Wenn das Objekt durch Garbage Collection erfasst wird, werden zugehörige Cache-Daten automatisch bereinigt.
- Nicht blockierende Ressourcenbereinigung: Wird für nicht blockierende Ressourcenbereinigungsaufgaben verwendet, wie z. B. die Benachrichtigung anderer Dienste, dass das Objekt gesammelt wurde.
7. Hinweise
- Maßvoll einsetzen:
CleanerEs wird hauptsächlich für spezielle Szenarien verwendet, wie z. B. die Gewährleistung leckfreier Nicht-Java-Ressourcen. Für einfaches Ressourcenmanagement,try-with-resourcesist besser geeignet. - Unkontrollierbare Ausführungszeit: Obwohl
Cleanerseine Bereinigungsaufgabe istfinalizezeitnaher, aber der genaue Ausführungszeitpunkt der Bereinigungsaufgabe hängt weiterhin von der Garbage-Collection-Zeit ab, was es für Ressourcenmanagement mit strengen Anforderungen an die Zeitnähe ungeeignet macht. - Vorsicht bei ressourcenintensiven Bereinigungsaufgaben: Vermeiden Sie
Cleanerdie Ausführung übermäßig komplexer oder lang andauernder Operationen darin, um die Garbage-Collection-Leistung nicht zu beeinträchtigen.
Insgesamt,java.lang.ref.Cleaneres ist das empfohlene Werkzeug zur Ressourcenbereinigung in Java und bietet eine effiziente und zuverlässige Möglichkeit der Ressourcenverwaltung.