# Verbrauch des RAM steigt unerwartet an



## Times (25. Feb 2016)

Hallo,

ich habe ein kleines Problem mit dem Resultset aus java (java.sql.ResultSet).
Unzwar verwende ich dieses in einer eigenen Klasse um mir RecordSets zusammenzustellen und um darüber schneller einzelne Datensätze zu bearbeiten. Nachdem die Arbeit getan ist sollte ja rein theoretisch alles aus dem RAM verschwinden... dem ist aber nicht so.

Das ResultSet müllt mir den RAM so dermaßen voll das das Programm nach einiger Zeit komplett abstürzt.
Nun habe ich mir zum Test eine close() Methode geschrieben welche im ersten Ansatz die close() Methode vom ResultSet aufgerufen hat. In diesem Ansatz ist NICHTS passiert.
Dannach bin ich hingegangen und habe die Variable selbst einfach auf null gesetzt. Hier war schon eine deutliche Verbesserung zu erkennen, aber es ist immernoch einiges über geblieben und nun ist das Programm erst nach einigen Stunden abgestürzt.

Zuletzt bin ich hingegangen und habe noch Runtime.getRuntime().gc() aufgerufen nachdem ich das ResultSet Objekt auf null gesetzt habe und hiermit funktioniert es reibungslos. Es bleibt nichts mehr im RAM.. alles wird schön brav entsorgt.

Die Frage die mich nun sehr interessiert ist warum ich das überhaupt machen muss?
Ich bin eigentlich davon ausgegangen das ein Objekt nach Verschwinden des Sichtbarkeitsbereiches komplett gelöscht wird und somit gelöscht wird.. aber dem ist ja demnach nicht so.. warum? Versteh ich da etwas falsch?

Danke


----------



## kneitzel (25. Feb 2016)

Also wenn ein Objekt nicht mehr referenziert wird, dann wird es nicht sofort gelöscht. Dann ist es erst in einem Status, dass der Garbage Collector es "einsammeln" und löschen kann. Der Garbage Collector läuft aber nicht ständig sondern nur von Zeit zu Zeit, weil dadurch ja auch Ressourcen verbraucht werden. Du kannst den Lauf des GC erzwingen, aber dies ist eigentlich nicht notwendig. Der Speicherverbrauch geht dann zwar nicht sofort zurück, aber wenn entsprechende Speicheranforderungen kommen, dann sollte der GC im Bedarfsfall auch angestoßen werden.

Wenn eine Instanz Closable implementiert, dann solltest Du aber immer close() aufrufen, ehe Du die Instanz nicht mehr referenzierst.


----------



## thecain (25. Feb 2016)

Ein ResultSet muss auf jeden Fall geschlossen werden, oder über Try with Ressource verwendet werden.


----------

