{"id":72,"date":"2008-09-19T17:07:18","date_gmt":"2008-09-19T16:07:18","guid":{"rendered":"http:\/\/www.epischel.de\/wordpress\/?p=72"},"modified":"2012-04-09T11:34:27","modified_gmt":"2012-04-09T10:34:27","slug":"finalizer-in-java-lieber-finger-weg","status":"publish","type":"post","link":"https:\/\/www.epischel.de\/wordpress\/2008\/09\/finalizer-in-java-lieber-finger-weg\/","title":{"rendered":"Finalizer in Java: lieber Finger weg!"},"content":{"rendered":"<p>Laut Java-Spezifikation werden Finalizer in Java aufgerufen, bevor das entsprechende Objekt durch den Garbage Collector aus dem Speicher entfernt wird. Das klingt erst mal verlockend &#8211; hier k\u00f6nnte man ja automatische das Freigeben von Resourcen unterbringen.<\/p>\n<p><strong>Aber!<\/strong> Es wird nicht garantiert, wann der Finalizer aufgerufen wird. Die freizugebenden Resourcen sind solange blockiert. Schlimmer kommt es noch, wenn ein Finalizer ungew\u00f6hnlich lange f\u00fcr die Verarbeitung ben\u00f6tigt. Dann k\u00f6nnen die Resourcen, die die Objekte der anderen anstehenden Finalizer halten, nicht freigegeben werden. Dies kann zu Out-of-Filehandles oder zu Out-of-Memory-Fehlern f\u00fchren, wenn die Entwickler sich auf die zeitnahe Abarbeitung von Finalizern verlassen.<\/p>\n<p>Dies ist uns letztens passiert: Unsere Anwendung beendet sich nachweisbar nach einigen hundert Webservice-Aufrufen. Ergebnis der Problemanalyse: Ein Objekt einer Klasse des Oracle IAS scheint den Finalizer-Warteschlange zu blockieren, somit werden Objekte aus dem AXIS-(1.0)-Framework nicht finalisiert, die jedoch Referenzen auf speicherfressende DOM-Objektb\u00e4ume halten. Diese DOM-Objektb\u00e4ume k\u00f6nnen dadurch nicht garbage-collected werden, sammeln sich an und schliesslich kommt der Out-of-Memory-Fehler. Im generierten Webservice-Stub-Code haben wir manuell den Aufruf an den Finalizer (genauer: an die dispose-Methode) eingef\u00fcgt und siehe da, dass Problem ist beseitigt.<\/p>\n<p>An einer anderen Stelle (ebenfalls AXIS) sind wir vor 1-2 Jahren in ein \u00e4hnliches Problem gelaufen, da ging es jedoch um FileHandles oder Netzwerk-Ports. Auch da half manuelles freigeben der Resourcen.<\/p>\n<p><strong>Fazit<\/strong>: Es ist besser, die Resourcen von Hand freizugeben. &#8222;Zur Sicherheit&#8220; mag man noch einen Finalizer schreiben, aber wenn dieser wiederum die Finalize-Warteschlange blockieren k\u00f6nnte (etwa weil auf ein Netzwerk-Timeout gewartet wird), dann sollte man auch davon die Finger lassen.<\/p>\n<p>Tools zum Analysieren von Memory-Dumps:<\/p>\n<ul>\n<li><a href=\"http:\/\/www.google.de\/search?hl=de&amp;q=sap+%22memory+analyzer%22\">SAP Memory-Analyzer<\/a><\/li>\n<li><a href=\"http:\/\/www.alphaworks.ibm.com\/tech\/heapanalyzer\">IBM HeapAnalyzer<\/a><\/li>\n<li><a href=\"http:\/\/h20392.www2.hp.com\/portal\/swdepot\/displayProductInfo.do?productNumber=HPUXJAVAHOME\">HP JMeter<\/a><\/li>\n<\/ul>\n<div class=\"syndication-links\"><\/div>","protected":false},"excerpt":{"rendered":"<p>Laut Java-Spezifikation werden Finalizer in Java aufgerufen, bevor das entsprechende Objekt durch den Garbage Collector aus dem Speicher entfernt wird. Das klingt erst mal verlockend &#8211; hier k\u00f6nnte man ja automatische das Freigeben von Resourcen unterbringen. Aber! Es wird nicht garantiert, wann der Finalizer aufgerufen wird. Die freizugebenden Resourcen sind solange blockiert. Schlimmer kommt es&hellip;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"mf2_syndication":[],"webmentions_disabled_pings":false,"webmentions_disabled":false,"footnotes":""},"categories":[3],"tags":[120,119],"series":[],"class_list":["post-72","post","type-post","status-publish","format-standard","hentry","category-java","tag-java","tag-entwicklung","kind-"],"kind":false,"_links":{"self":[{"href":"https:\/\/www.epischel.de\/wordpress\/wp-json\/wp\/v2\/posts\/72","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.epischel.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.epischel.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.epischel.de\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.epischel.de\/wordpress\/wp-json\/wp\/v2\/comments?post=72"}],"version-history":[{"count":2,"href":"https:\/\/www.epischel.de\/wordpress\/wp-json\/wp\/v2\/posts\/72\/revisions"}],"predecessor-version":[{"id":327,"href":"https:\/\/www.epischel.de\/wordpress\/wp-json\/wp\/v2\/posts\/72\/revisions\/327"}],"wp:attachment":[{"href":"https:\/\/www.epischel.de\/wordpress\/wp-json\/wp\/v2\/media?parent=72"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.epischel.de\/wordpress\/wp-json\/wp\/v2\/categories?post=72"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.epischel.de\/wordpress\/wp-json\/wp\/v2\/tags?post=72"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/www.epischel.de\/wordpress\/wp-json\/wp\/v2\/series?post=72"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}