# Speicher freigeben klappt nicht bei Image Objekten, warum?



## HaraldM (25. Jun 2005)

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 ;-)


```
...
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)


----------



## Jockel (25. Jun 2005)

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 "


----------



## HaraldM (25. Jun 2005)

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


----------



## Roar (25. Jun 2005)

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?


----------



## Gast (26. Jun 2005)

könnte ich denn die referenz auf das objekt irgendwie manuell löschen?


----------



## messi (26. Jun 2005)

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.


----------



## Jockel (26. Jun 2005)

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.


----------



## Guest (26. Jun 2005)

Eine gute Lösung ist, mit WeakReference oder SoftReference zu arbeiten.
Wird der Speicher knapp, werden die referenzierten Objekte freigegeben.


----------



## Bleiglanz (27. Jun 2005)

wahrscheinlich wirst du doch das bild irgendwo anzeigen?

und diese anzeigetafel hat eine referenz auf das imageicon

und diese referenz musst du loswerden


----------

