Speicher freigeben klappt nicht bei Image Objekten, warum?

  • Themenstarter Themenstarter HaraldM
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
H

HaraldM

Gast
Hallo,

ich lade in meiner Software ein Image und habe das Problem, dass Java den Speicher nicht wieder freigibt.

Mein Quelltext sieht wie folgt aus (leicht vereinfacht ;-)

Code:
...
ImageIcon ii = new ImageIcon("c:\\image.jpg");
...

Das JPEG ist ca 3 MB groß und wenn Java es lädt, braucht es dafür rund 60 MB (das ist auch völlig ok so). Das Problem ist nun, dass Java diese 60 MB nicht mehr freigibt obwohl ich im späteren Quelltext nie mehr das ImageIcon Objekt benutze.

System.gc() hilft auch nicht und es ist auch egal was für und wieviel Quelltext ich vor dem Initialisieren des ImageIcons habe. Die obige Zeile beansprucht 60 MB - dauerhaft.

Wißt ihr, wie ich den Speicher wieder freigeben kann?

Viele Grüße
Harald

P.S: Interessant ist in dem Zusammenhang auch, dass wenn ich das Image in einer grafischen Benutzeroberfläche lade und diese Oberfläche von Hand minimiere, der Speicher auf 4 MB abfällt und das obwohl ich das ImageIcon später in einer Methode nochmal verwende (maximiere ich die Gui wieder, bleibt es trotzdem bei den 4 MB)
 
Der Aufruf von System.gc() ist ja auch nur ein 'Vorschlag' an die VM, nicht benutzte Objekte zu entfernen.
Außerdem widersprichst du dir etwas:
"obwohl ich im späteren Quelltext nie mehr das ImageIcon Objekt benutze"
"obwohl ich das ImageIcon später in einer Methode nochmal verwende "
 
zu dem widerspruch: das obere beispiel dient nur zur veranschaulichung - wozu sollte ich ein Objekt initialisieren, wenn ich es nie benutze (aber der speicher wird halt auch in diesem "sinnlosen" fall nicht freigegeben
 
wahrscheilnich weil du noch eine referenz auf das objekt hast. solang du noch eine referenz hast, wird der speicher nicht freigegeben. hast du das objekt evtl als instanzvariable? wenn ja ist es nicht möglich das objekt als lokale variable zu deklarieren und zu benutzen?
 
könnte ich denn die referenz auf das objekt irgendwie manuell löschen?
 
System.gc() ist kein Vorschlag an die VM, sondern es wird wirklich eine Garbage Collection durchgeführt.
Außerdem meinst du sicherlich den echten Speicher, den die VM belegt und nicht das Objekt. Dieser Speicher ist nicht verkleinerbar. Er kann nur größer werden.
 
messi hat gesagt.:
System.gc() ist kein Vorschlag an die VM, sondern es wird wirklich eine Garbage Collection durchgeführt.
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/System.html#gc() hat gesagt.:
Calling the gc method suggests that the Java Virtual Machine expend effort toward recycling unused objects in order to make the memory they currently occupy available for quick reuse.
 
Eine gute Lösung ist, mit WeakReference oder SoftReference zu arbeiten.
Wird der Speicher knapp, werden die referenzierten Objekte freigegeben.
 
wahrscheinlich wirst du doch das bild irgendwo anzeigen?

und diese anzeigetafel hat eine referenz auf das imageicon

und diese referenz musst du loswerden
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben