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.
  • Ersetzenfinalize, automatische Ressourcenfreigabe implementieren, Ressourcenlecks vermeiden, die durch vergessenes Aufrufen verursacht werdenclose()die Methode.

2. CleanerGrundlegende Verwendung

Das Folgende istCleanerdie grundlegende Verwendung:

  • ErstelleCleanerein Beispiel:Cleaner.create()。
  • Erstellen Sie ein Objekt, das bereinigt werden muss, und registrieren Sie es zusammen mit der Bereinigungsaktion beiCleanerdem 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

import java.lang.ref.Cleaner;

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:InResourceder Klasse, rufen Siecleaner.register(this, new ResourceCleaner())um das aktuelle Objekt beiCleanerdem Cleaner zu registrieren, wobei die Bereinigungsaufgabe angegeben wirdResourceCleaner。
  • Automatische Bereinigung:Wenn dasResourceInstanz 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:Durchclose()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: ObwohlCleanerseine 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 SieCleanerdie 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.

Andere Erweiterungen