Upgrade to Pro — share decks privately, control downloads, hide ads and more …

DWX'22: Der Tatortreiniger – Cleaner API u.a. Alternativen zu finalize()

DWX'22: Der Tatortreiniger – Cleaner API u.a. Alternativen zu finalize()

Object.finalize() existiert seit Java 1.0 als Methode, die der Garbage Collector kurz vor dem Dereferenzieren geeigneter Objekts aufruft, um Bereinigungsmaßnahmen durchzuführen, wie z.B. Schließen von Datenbankverbindungen, File Handles, Netzwerkverbindungen oder ähnliche Ressourcenfreigabe.

Diese Methode ist aber nicht immer zuverlässig, da die JVM entscheidet, ob sie aufgerufen wird, oder nicht. Seit Java 9 ist sie deprecated und soll in absehbarer Zeit entfernt werden.

Diese Session präsentiert Alternativen wie das Cleaner API, PhantomReference, AutoCloseable oder Try with Resources inklusive anschaulicher Hands-On Beispiele.

Werner Keil

July 08, 2022
Tweet

More Decks by Werner Keil

Other Decks in Programming

Transcript

  1. © 2022 Werner Keil. Alle Rechte vorbehalten. #DWX22 #Java #CleanerAPI

    #Finalizer #Tatortreiniger Agenda 1. Finalizer 2. Try with Resources 3. PhantomReference 4. Cleaner API 5. Demos 6. Q&A
  2. © 2022 Werner Keil. Alle Rechte vorbehalten. #DWX22 #Java #CleanerAPI

    #Finalizer #Tatortreiniger Was bin ich? Werner Keil • Consultant – Coach • Creative Cosmopolitan • Open Source Evangelist • Software Architect • Author, Speaker • Maintenance Lead – JSR 354, 385 • Jakarta EE Spec Committee Member [www.linkedin.com/in/catmedia]
  3. © 2022 Werner Keil. Alle Rechte vorbehalten. #DWX22 #Java #CleanerAPI

    #Finalizer #Tatortreiniger Finalizer Bild © 2005-2022 Vinyl Record Albums. Alle Rechte vorbehalten.
  4. © 2022 Werner Keil. Alle Rechte vorbehalten. #DWX22 #Java #CleanerAPI

    #Finalizer #Tatortreiniger Finalize Object.finalize() existiert seit Java 1.0 als Methode, die der Garbage Collector kurz vor dem Dereferenzieren geeigneter Objekte aufruft, um Bereinigungsmaßnahmen durchzuführen, wie z.B. Schließen von Datenbankverbindungen, File Handles, Netzwerkverbindungen oder ähnliche Ressourcenfreigabe.
  5. © 2022 Werner Keil. Alle Rechte vorbehalten. #DWX22 #Java #CleanerAPI

    #Finalizer #Tatortreiniger Finalize Bild © 2005-2022 Vinyl Record Albums. Alle Rechte vorbehalten. Objekt-Lebenszyklus
  6. © 2022 Werner Keil. Alle Rechte vorbehalten. #DWX22 #Java #CleanerAPI

    #Finalizer #Tatortreiniger Finalize Diese Methode ist aber nicht immer zuverlässig, da die JVM entscheidet, ob sie aufgerufen wird, oder nicht, wodurch finalize() zu zahlreichen Problemen von Performanceverlusten bis zu Deadlocks führen kann. Seit Java 9 ist sie deshalb deprecated und soll in absehbarer Zeit entfernt werden.
  7. © 2022 Werner Keil. Alle Rechte vorbehalten. #DWX22 #Java #CleanerAPI

    #Finalizer #Tatortreiniger Finalize oder Finally? Bild © 2005-2022 Vinyl Record Albums. Alle Rechte vorbehalten. finalize finally finalize is the method in Java. finally block is used in java Exception Handling to execute the important code after try-catch blocks. finalize() method is used to perform clean-up processing just before an object is garbage collected. finally block executes whether an exception occurs or not. It is used to close resources. It is used with objects. It is used with the try-catch block in exception handling. finalize method is executed just before the object is destroyed. finally block cleans up all the resources used in the try block. finalize method is executed just before the object is destroyed. finally block executes as soon as the execution of try-catch block is completed without depending on the exception.
  8. © 2022 Werner Keil. Alle Rechte vorbehalten. #DWX22 #Java #CleanerAPI

    #Finalizer #Tatortreiniger Finally als Alternative Beim Ausführen von Java Programmen können verschiedene Fehler auftreten: Codierungsfehler des Programmierers, Fehler durch falsche Eingaben oder andere unvorhersehbare Situationen wie Netzwerkprobleme.
  9. © 2022 Werner Keil. Alle Rechte vorbehalten. #DWX22 #Java #CleanerAPI

    #Finalizer #Tatortreiniger Finally als Alternative Mit der try Anweisung können Sie einen Codeblock definieren, der während der Ausführung auf Fehler getestet wird. Mit der catch Anweisung können Sie einen Codeblock definieren, der ausgeführt wird, wenn im try Block ein Fehler auftritt. Mit der finally Anweisung definieren Sie einen Codeblock, der in jedem Fall ausgeführt wird, egal ob ein Fehler auftrat oder nicht.
  10. © 2022 Werner Keil. Alle Rechte vorbehalten. #DWX22 #Java #CleanerAPI

    #Finalizer #Tatortreiniger Finally Bild © 2005-2022 Vinyl Record Albums. Alle Rechte vorbehalten. Flow mit oder ohne Exception
  11. © 2022 Werner Keil. Alle Rechte vorbehalten. #DWX22 #Java #CleanerAPI

    #Finalizer #Tatortreiniger Try Finally MongoDB Beispiel MongoCursor<Document> cursor = collection.find().iterator(); try { while (cursor.hasNext()) { System.out.println(cursor.next().toJson()); } } finally { cursor.close(); }
  12. © 2022 Werner Keil. Alle Rechte vorbehalten. #DWX22 #Java #CleanerAPI

    #Finalizer #Tatortreiniger Try-with-Resources Den try-with-resources Befehl kann man seit Java 7 benutzen. Er erlaubt das Schließen von Ressourcen und ersetzt damit den finally Block. Um diese Variante zu verwenden, muss die Klasse die Schnittstelle java.lang.AutoCloseable bzw. java.io.Closeable implementieren.
  13. © 2022 Werner Keil. Alle Rechte vorbehalten. #DWX22 #Java #CleanerAPI

    #Finalizer #Tatortreiniger PhantomReference Bild © 2011-2022 Amazon. Alle Rechte vorbehalten.
  14. © 2022 Werner Keil. Alle Rechte vorbehalten. #DWX22 #Java #CleanerAPI

    #Finalizer #Tatortreiniger PhantomReference Objekte, auf die durch Phantomreferenzen verwiesen wird, sind für die Garbage Collection geeignet. Bevor sie aus dem Speicher entfernt werden, stellt JVM sie in eine so genannte "Referenzwarteschlange" (ReferenceQueue) Sie werden in eine Referenzwarteschlange gestellt, nachdem sie finalisierbar wurden. Um solche Referenzen zu erstellen, wird die Klasse java.lang.ref.PhantomReference verwendet.
  15. © 2022 Werner Keil. Alle Rechte vorbehalten. #DWX22 #Java #CleanerAPI

    #Finalizer #Tatortreiniger PhantomReference Beispiel String value = new String("Mein String"); ReferenceQueue<String> referenceQueue = new ReferenceQueue<String>(); PhantomReference<String> phantomReference = new PhantomReference<String>(value, referenceQueue);
  16. © 2022 Werner Keil. Alle Rechte vorbehalten. #DWX22 #Java #CleanerAPI

    #Finalizer #Tatortreiniger Cleaner API Bilder © 2011-2018 NDR. Alle Rechte vorbehalten.
  17. © 2022 Werner Keil. Alle Rechte vorbehalten. #DWX22 #Java #CleanerAPI

    #Finalizer #Tatortreiniger Cleaner API Cleaner verwaltet eine Reihe von Objektreferenzen und entsprechenden Bereinigungsmaßnahmen. Bereinigungsmaßnahmen werden registriert um ausgeführt zu werden, nachdem der Bereinigungsroutine mitgeteilt wurde, dass das Objekt phantomerreichbar wurde. Der Cleaner verwendet also intern eine PhantomReference und die ReferenceQueue, um benachrichtigt zu werden, wenn sich die Erreichbarkeit ändert.
  18. © 2022 Werner Keil. Alle Rechte vorbehalten. #DWX22 #Java #CleanerAPI

    #Finalizer #Tatortreiniger Cleaner API Jeder Cleaner arbeitet unabhängig, verwaltet die anstehenden Reinigungsaktionen und handhabt das Einfädeln und Beenden, wenn der Reiniger nicht mehr verwendet wird. Das Registrieren einer Objektreferenz und der entsprechenden Bereinigungsaktion gibt ein Cleanable zurück . Die effizienteste Verwendung besteht darin, die clean - Methode explizit aufzurufen , wenn das Objekt geschlossen oder nicht mehr benötigt wird
  19. © 2022 Werner Keil. Alle Rechte vorbehalten. #DWX22 #Java #CleanerAPI

    #Finalizer #Tatortreiniger Cleaner API Beispiel public class CleaningExample implements AutoCloseable { // Ein Cleaner, vorzugsweise einer, der innerhalb einer Bibliothek geteilt wird private static final Cleaner cleaner = <cleaner>; static class State implements Runnable { State(...) { // Zustand initialisieren, der für die Reinigungsaktion benötigt wird } public void run() { // Bereinigungsaktion, die auf den Zustand zugreift, wird höchstens einmal ausgeführt }
  20. © 2022 Werner Keil. Alle Rechte vorbehalten. #DWX22 #Java #CleanerAPI

    #Finalizer #Tatortreiniger Cleaner API Beispiel (2) […] private final State state; private final Cleaner.Cleanable cleanable; public CleaningExample() { this.state = new State(...); this.cleanable = cleaner.register(this, state); } public void close() { cleanable.clean(); } }
  21. © 2022 Werner Keil. Alle Rechte vorbehalten. #DWX22 #Java #CleanerAPI

    #Finalizer #Tatortreiniger Demo Time @ivar_grimstad @wernerkeil
  22. © 2022 Werner Keil. Alle Rechte vorbehalten. #DWX22 #Java #CleanerAPI

    #Finalizer #Tatortreiniger • https://github.com/keilw/finalizer-alternatives • https://openjdk.org/jeps/421 Links & Ressourcen
  23. © 2022 Werner Keil. Alle Rechte vorbehalten. #DWX22 #Java #CleanerAPI

    #Finalizer #Tatortreiniger Q&A Bild: Letterbox Filmproduktion
  24. © 2022 Werner Keil. Alle Rechte vorbehalten. #DWX22 #Java #CleanerAPI

    #Finalizer #Tatortreiniger Vielen Dank Bild © 2011-2018 NDR. Alle Rechte vorbehalten.