{"id":3609,"date":"2017-02-19T20:56:36","date_gmt":"2017-02-19T18:56:36","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=3609"},"modified":"2017-02-19T20:56:36","modified_gmt":"2017-02-19T18:56:36","slug":"schwache-referenzen-und-cleaner","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2017\/02\/schwache-referenzen-und-cleaner\/","title":{"rendered":"Schwache Referenzen und Cleaner"},"content":{"rendered":"<p>Die Referenzen auf Objekte, die wir im Alltag um uns herum haben, hei\u00dfen starke Referenzen, weil die automatische Speicherbereinigung niemals ein benutztes Objekt freigeben w\u00fcrde. Neben den starken Referenzen gibt es jedoch auch schwache Referenzen, die es dem GC erlaubt, die Objekte zu entfernen. Was erst einmal verr\u00fcckt klingt wird dann interessant, wenn es um die Implementierung von Caching-Datenstrukturen geht; ist das Objekt im Cache, ist das sch\u00f6n und der Zugriff schnell \u2013 ist das Objekt nicht im Cache, dann ist das auch in Ordnung, und der Zugriff dauert etwas l\u00e4nger. Wir k\u00f6nnen schwache Referenzen also gut verwenden, um im Cache liegende Objekte aufzubauen, die die automatische Speicherbereinigung wegr\u00e4umen darf, wenn es im Speicher knapp wird.<\/p>\n<p>Schwache Referenzen interagieren also in einer einfachen Weise mit der automatischen Speicherbereinigung und daf\u00fcr gibt es im java.base-Modul im Paket java.lang.ref\u00a0ein paar Typen. Am Wichtigsten sind die Beh\u00e4lter (engl. reference object gennant), die wie ein Optional ein Objekt referenzieren, das aber pl\u00f6tzlich verschwunden sein kann:<\/p>\n<ul>\n<li>SoftReference&lt;T&gt;. Ein Beh\u00e4lter f\u00fcr softly reachable Objekte. Die Objekte werden vom GC sp\u00e4t freigegeben, wenn es kurz vor einem OutOutMemoryError<\/li>\n<li>WeakReference&lt;T&gt;. Ein Beh\u00e4lter f\u00fcr weakly reachable Objekte. Die Objekte werden vom GC schon relativ fr\u00fch beim ersten GC freigegeben.<\/li>\n<li>PhantomReference&lt;T&gt;. Ein Beh\u00e4lter, der immer leer ist, aber dazu dient mitzubekommen, wenn der GC sich von einem Objekt trennt.<\/li>\n<li>Reference&lt;T&gt;. Abstakte Basisklasse von PhantomReference, SoftReference, WeakReference.<\/li>\n<\/ul>\n<p>Die Beh\u00e4lter selbst werden vom GC nicht entfernt, sodass eine ReferenceQueue&lt;T&gt; ein Abfragen erlaubt, um festzustellen, welche Reference-Beh\u00e4lter leer sind und z. B. aus einer Datenstruktur entfernt werden k\u00f6nnen \u2013 leere Beh\u00e4lter sind nutzlos und k\u00f6nnen nicht wieder recycelt werden.<\/p>\n<p>Ein neuer Typ ab Java 9 im Paket ist Cleaner, der eine Alternative zur Finalizierung ist. Beim Cleaner l\u00e4sst sich eine Operation (vom Typ Cleaner.Cleanable) anmelden, die immer dann aufgerufen wird, wenn die automatische Speicherbereinigung zuschl\u00e4gt und das Objekt nicht mehr erreichbar ist. Intern greift die Klasse auf PhantomReference zur\u00fcck.<\/p>\n<p>Beispiel:\u00a0Lege einen Punkt an, registriere einen Cleaner und rege danach den GC an. Eine Konsolenausgabe \u201ePunkt ist weg!\u201c ist wahrscheinlich:<\/p>\n<pre>Point p = new Point( 1, 2 );\n\nCleaner.create().register( p, () -&gt; System.out.println( \"Punkt ist weg!\" ) );\n\np = null;\n\nbyte[] bytes = new byte[ (int) Runtime.getRuntime().freeMemory() ];<\/pre>\n<p>Auf keinen Fall darf die Aufr\u00e4umoperation p wieder referenzieren.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Referenzen auf Objekte, die wir im Alltag um uns herum haben, hei\u00dfen starke Referenzen, weil die automatische Speicherbereinigung niemals ein benutztes Objekt freigeben w\u00fcrde. Neben den starken Referenzen gibt es jedoch auch schwache Referenzen, die es dem GC erlaubt, die Objekte zu entfernen. Was erst einmal verr\u00fcckt klingt wird dann interessant, wenn es um [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[11,85],"tags":[],"class_list":["post-3609","post","type-post","status-publish","format-standard","hentry","category-insel","category-java-9"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/3609","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=3609"}],"version-history":[{"count":1,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/3609\/revisions"}],"predecessor-version":[{"id":3610,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/3609\/revisions\/3610"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=3609"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=3609"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=3609"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}