Speicherplatz eies RIESEN objektes direkt wieder freigeben

roxX0r

Mitglied
hio

kurz gesagt geht es um folgendes. Ich habe eine Objekt einer Klasse, die Daten verwaltet. Das Programm liest dieses Daten (sehr sehr viele) aus einer TXT Datei ein und das Objekt nimmt sie auf (in Vectoren und einer hashmap). Nun muss ich aber während das Programm läuft, auch andere Dateien (die auch groß sind) einlesen und dafür brauche ich dann diese alte Datei nicht mehr (es ist immer nur eine relevant). Deshalb möchte ich das alte Objekt (mit den Vectoren und der HashMap) komplett löschen und den Speicher direkt wiederfreigeben.

Ich habe schon probiert das Objekt auf null zu setzen und dann "System.gc" aber das bringt nichts. Auch alle Collections mit clear zu resetten bringt nichts (Ich überwache den Speicherbedarf im Windows Taskmanager). Ich möchte, sobald ich den Speicher freigebe, dass im TaskManager der aufgenommene Speicher freigebene wird ..

wie kann ich das bewerkstelligen ? mit dem garbage collector aufruf funktioniert es nicht. Und meine Klasse überschreibt auch nicht "finalize()" ..

Danke für die Hilfe
 
Hallo,

in java zählt jedes Objekt die Referenzen auf sich selbst. Wenn der Garbage Collector den Speicherplatz nicht frei gibt heißt das, dass noch eine Referenz besteht, selbst wenn das Objekt auf null ist:

Code:
Vector v1 = new Vector(100000)
Vector v2 = v1;
v1 = null;

in dem Fall würde der Speicherplatz von v1 nicht freigegeben werden obwohl v1 auf null gesetzt ist, weil v2 noch eine Referenz darauf hat.
Damit der Garbage Collector den Speicher freigibt musst du also darauf achten, dass keine Referenzen mehr auf das Objekt bestehen. Evtl. kann man das mit dem Debugger rausfinden.
Außerdem hab ich was gelesen über das 'java.lang.ref' package, mit dem man wohl etwas Speicher-freundlichere Referenzen erstellen kann.
http://java.sun.com/javase/6/docs/api/java/lang/ref/package-summary.html
 
Hallo,

HashMaps sind überlicherweise Quellen für MemoryLeaks... mach mal die HashMap explizit leer mit einem clear() Aufruf / das gleiche machst du noch mit dem Vector. Anschließend setzt du die referenzierenden Attribute auf null. Weiterhin solltest du schauen, ob du nicht noch von woanders "starke" Referenzen auf die HashMap/den VEctor oder die Elemente darin hälst. Diese verhindern nämlich eine Garbage Collection dieser Instanz.

Gruß Tom
 
Zurück