memory heap problem

Status
Nicht offen für weitere Antworten.
S

Singh

Gast
Hallo Leute,

Ich versuche gerade ein kleines Bildbetrachtungsprogramm zu schreiben. Man gibt einen Pfad an und es laed die sich alle im Ordner befindlichen Bilder in das Programm und zeigt sie als Thumbnails an und sobald man auf eines der Thumbnails klickt, wird es oben groesser angezeigt.

Doch jedesmal, wenn ich mehrmals auf verschiedene thumbnails klicken bekomme ich die Fehlermeldung:
java.lang.OutOfMemoryError: Java heap space.


Bei jedem Bild wird diese Methode aufgerufen, um sie in thumbnail-Groessen zu verkleinern und dann anzeigen zu lassen.

Spaeter wenn alles geladen wurde und der User auf eines der Thumbnails(Die Button-Icons sind) klickt, wird das entsprechende Bild erneut etwas groesser im obrigen Panel aufgerufen und genau dann kommt die Fehlermeldung.


Code:
thumbnail = new ImageIcon(resizedImage(icon.getImage(), 33, 33));
Code:
ImageIcon thumbnail = new ImageIcon(resizedImage(ico.getImage(), 800, 550), a);

Mit diesen beiden Codes wird die Methode jedesmal aufgerufen, wenn ein Bild verkleinert wird oder vergroessert



Hier mal der Code, der den Fehler verursacht:

Code:
private Image resizedImage(Image icon2, int w, int h) {                            
		Graphics2D g2;	
			try {
				BufferedImage resizedImg = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
				g2 = resizedImg.createGraphics();
				g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
				g2.drawImage(icon2, 0, 0, w, h, null);
				g2.dispose();
				w = 0;
				h = 0;
				g2 = null;
				return resizedImg;
			}
			catch(OutOfMemoryError ooME){
				
			 return null;
			}
			
			
	}

Ich habe versucht die Objekte danach auf null zu setzen, um sie freizusetzen, doch auch das hat nicht funktioniert.
Irgendeiner eine Idee was man hier machen koennte?

Vielen Dank.
 
G

Guri

Gast
Hallo,

Also die Größe habe ich bereit erhoeht. Bis zu 256MB. Wenn ichs auf 512mb erhoehe gibts starke verzoegerungen im Programm.

Das komische ist doch, dass ich sogar versucht habe die resizedImg = null zu setzen, jedesmal nachdem das Objekt benutzt wurde und trotzdem wird der Speicher zu sehr verbraucht.

Wie koennte ich es so umstellen, dass das Objekt gleich nachdem es benutzt wurden ist mit dem Garbarge Collector freigegeben wird.

Ich koennte auch jedes bild verkleinert abspeichern und dann diese aufrufen, welches den Prozess effizienter machen wuerde, doch ich wuerde gerade wissen ob es auch so eine Moeglichkeit gibt da herumzu kommen.

Es gibt bestimmt vieel groessere Programme, bei denen viel mehr Objekte erzeugt werden.

Wieso hat JVM so schnell kein Speicher mehr zur verfuegung, bei meinem Beispiel?
 

kleiner_held

Top Contributor
Objekte auf null setzten ist sehr schwammig, denn wenn der GC den Speicher freigeben soll darf keine Referenz mehr auf die geladenen Images existieren. Und wenn du ein ImageIcon fuer dein geladenes Image anlegst, wird das Image von ImageIcon referenziert auch wenn du nachher deine resizedImg Variable auf null setzt.
Damit der garbage collector aufraeumen kann muesste dann also das ImageIcon unreferenziert sein. Man muss schon genau aufpassen das nicht irgendwo noch Referenzen vorliegen die man nicht bedacht hat, vor allem wenn das Icon zB an ein JLabel weitergereicht wurde. Rausfinden kann man das am Ende nur mit einem Profiler.

Wenn man wirklich speicherschonend arbeiten will, kann man auch auf Image.flush() zurueckgreifen. Die Methode ist bei einem selbst erstellten BufferedImage nicht sehr wirkungsvoll, wohl aber bei Toolkit.getDefaultToolkit().createImage(URL).

Noch ein Tipp: ein Bild auf 33x33 Pixel zu verkleinern und dann das verkleinerte spaeter wieder auf 800x550 zu vergroessern ist nicht empfehlenswert.
 
G

Guri

Gast
Erstmal vielen Dank fuer die Antworten.

Natuerlich uebergebe ich mit den thumbnail nur den direkten Pfad zu den Bildern und lad das Orginalbild erneut in das Programm als 800x550, wenn auf einem der Thumbnails geklickt wird.

Um deine Antwort nur nocheinmal zu bestaetigen. Wenn ich also ein ImageIcon erstelle, welches zum Image referenziert, darf keines der beiden mehr irgendwo referenziert sein?

Falls ich das also in einem Unterprogramm tue, entsorgt der GC die unnoetigen Objekte automatisch, sobald es von der Methode ins Hauptprogramm springt, und keines der Objekte mehr referenziert ist, richtig ?
 

kleiner_held

Top Contributor
Wann der GC die Objekte entsorgt ist nicht spezifiziert. Wenn noch genuegend Speicher verfuegbar ist kann die JVM die GC Ausfuehrung auch sehr lange verzoegern. Allerdings sollte die JVM einen GC Lauf durchfuehren bevor ein OutOfMemoryError noetig wird. Der GC behandelt alle unrefenzierten Objekte, unabhaengig davon wo sie erstellt wurden.
 
G

Gast

Gast
nen System.gc() nach grafikoperationen hat bei mir immer geholfen...
 

FArt

Top Contributor
Gast hat gesagt.:
nen System.gc() nach grafikoperationen hat bei mir immer geholfen...

Das ist völlig unnötig... im Gegenteil, u.U. macht das mehr kaputt als es gut macht. Der GC weiß, wann er laufen muss. Das Tuning (seine Strategie) kann man konfigurieren. Wenn du da manuell eingreifst, ist die Strategie für den Popo.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Java memory fehler: Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap spa Java Basics - Anfänger-Themen 5
T Out of Memory (Java Heap Space) Java Basics - Anfänger-Themen 9
B Image Matching in Memory Minigame Java Basics - Anfänger-Themen 7
B Memory Spiel Java Basics - Anfänger-Themen 29
J Memory-Spiel Aktivierung der Methode mit Timer Java Basics - Anfänger-Themen 44
Olis Erste Schritte Simples Memory Spiel möglich? Java Basics - Anfänger-Themen 1
Spencer Reid JavaFX Memory Thread.sleep Java Basics - Anfänger-Themen 1
T Art 4 Felder Matrix Memory Java Basics - Anfänger-Themen 2
V Memory Logik Problem/Denkblockade, bitte helft Java Basics - Anfänger-Themen 1
pinar memory spiel Java Basics - Anfänger-Themen 10
P NullPointerException in Memory-Spiel Java Basics - Anfänger-Themen 5
P Layout Manager - Welches Layout für Memory? Java Basics - Anfänger-Themen 7
A Java memory leakage Java Basics - Anfänger-Themen 9
S Datentypen Memory Problem Java Basics - Anfänger-Themen 12
I Memory-Spiel Feld nur einmal mischen Java Basics - Anfänger-Themen 2
O Memory Thread.sleep() Java Basics - Anfänger-Themen 5
K Memory-Spiel stecke Fest Java Basics - Anfänger-Themen 2
K Ein Memory Spiel ! Java Basics - Anfänger-Themen 6
K Memory-Spiel alle verdeckte karten aufdecken. Java Basics - Anfänger-Themen 26
T Memory Leak und der Garbage Collector Java Basics - Anfänger-Themen 21
A Memory Probleme beim Laden von thumbnails Java Basics - Anfänger-Themen 3
J Memory Footprint von Objekten Java Basics - Anfänger-Themen 2
I Memory-Spiel Java Basics - Anfänger-Themen 2
W Servlet - out of memory Java Basics - Anfänger-Themen 7
G Memory-Spiel Java Basics - Anfänger-Themen 8
B Memory - Zufällige Anordnung von Buchstabenpaaren Java Basics - Anfänger-Themen 8
J Memory Java Basics - Anfänger-Themen 2
G Memory Projekt, Fragen über Fragen Java Basics - Anfänger-Themen 6
B Memory in Java Java Basics - Anfänger-Themen 16
T Out of Memory Error Java Basics - Anfänger-Themen 7
E Heapspace out of Memory Java Basics - Anfänger-Themen 8
V Ist Off-Heap-Speicher dasselbe wie Stack-Speicher? Java Basics - Anfänger-Themen 2
S Java Client-je nach Heap Size Größe startet Applikation oder nicht Java Basics - Anfänger-Themen 4
KogoroMori21 Stack und Heap Speicher Java Basics - Anfänger-Themen 1
G Min und Max heap Java Basics - Anfänger-Themen 1
M Java heap space Fehlermeldung beheben Java Basics - Anfänger-Themen 3
F speicherort stack oder heap Java Basics - Anfänger-Themen 1
M Algorithmus Max-Heap? Java Basics - Anfänger-Themen 3
P Stack, Heap Java Basics - Anfänger-Themen 13
G Heap Space erhöhen (64bit) Java Basics - Anfänger-Themen 45
A Heap Space Error bei rekursiver Suche in Dateien trotz nur einer Zeile im Speicher Java Basics - Anfänger-Themen 26
J Array von Objekten, wie schauts im Heap / Stack aus ? Java Basics - Anfänger-Themen 7
V Heap-Sort Java Basics - Anfänger-Themen 0
M Frage zu Stack und Heap Java Basics - Anfänger-Themen 1
H Heap-Auslasung verdoppelt sich schlagartig Java Basics - Anfänger-Themen 3
M Java Arbeitsspeicherverbrauch, Heap Space error korrigieren? Java Basics - Anfänger-Themen 18
H Heap Java Basics - Anfänger-Themen 4
D Java Heap Space Probleme Java Basics - Anfänger-Themen 7
B Stack/Heap Frage Java Basics - Anfänger-Themen 36
C Warning: Type safety: Potential heap pollution via varargs parameter array Java Basics - Anfänger-Themen 5
S Input/Output Java heap space Java Basics - Anfänger-Themen 8
W Compiler-Fehler "Could not reserve enough space for object heap"... und dann raucht das Programm ab Java Basics - Anfänger-Themen 3
B OOP Zwei gleichnamige Objekte auf dem heap Java Basics - Anfänger-Themen 4
H Heap Java Basics - Anfänger-Themen 2
A Java heap space Java Basics - Anfänger-Themen 11
B Heap-Speicher wieder freigeben Java Basics - Anfänger-Themen 10
D java heap space Java Basics - Anfänger-Themen 6
S Java Heap space trotz -Xmx1024 Java Basics - Anfänger-Themen 10
N Heap Dump Java Basics - Anfänger-Themen 23
C 'OutOfMemoryError: Java heap space' Java Basics - Anfänger-Themen 5
E ternärer Heap in Array-Form Java Basics - Anfänger-Themen 6
L heap space, LinkedList umspeichern Java Basics - Anfänger-Themen 15
E begrenzung des platzes im heap Java Basics - Anfänger-Themen 4
D java.lang.outofmemoryerror java heap space bei Hashtable Java Basics - Anfänger-Themen 3
G Frage zur Heap-Belegung Java Basics - Anfänger-Themen 2
neurox java.lang.OutOfMemoryError: Java heap space Java Basics - Anfänger-Themen 18
B java.lang.OutOfMemoryError: Java heap space bei Musikplayer Java Basics - Anfänger-Themen 7
M Java Heap Space durch Übergang von einer Klasse in die ander Java Basics - Anfänger-Themen 3
N Applet Heap vergrößern Java Basics - Anfänger-Themen 10
G warum heap space problem? Java Basics - Anfänger-Themen 6
G heap size vergrößern Java Basics - Anfänger-Themen 6
V warum heap space überlastung Java Basics - Anfänger-Themen 2
G error wegen heap space Java Basics - Anfänger-Themen 4
M Beadarf ermitteln für Java heap space Java Basics - Anfänger-Themen 4
M Dateien lesen/schreiben und Heap Space Probleme Java Basics - Anfänger-Themen 8
G Aktuelle Heap-Größe auslesen? Java Basics - Anfänger-Themen 3
G Aus Array einen Heap erstellen Java Basics - Anfänger-Themen 5
D suchbaum out of heap space Java Basics - Anfänger-Themen 8
D Heap erweitern Java Basics - Anfänger-Themen 3
R Java heap space Java Basics - Anfänger-Themen 4
E Heap Size einstellen Java Basics - Anfänger-Themen 7
S OutOfMemoryError: Java heap space Java Basics - Anfänger-Themen 6
J Morgen Java-Klausur. Stack, Heap, Method-Area Java Basics - Anfänger-Themen 2
M Java Heap Space während der Laufzeit ändern Java Basics - Anfänger-Themen 2
E fehlermeldung "java heap space" Java Basics - Anfänger-Themen 21
E wieviele objekte am heap?? Java Basics - Anfänger-Themen 14
K Verständnis Problem bei Server/Client Java Basics - Anfänger-Themen 2
I WildFily - unterschiedliche Libs im Projekt verursachen Problem Java Basics - Anfänger-Themen 11
imocode Vererbung Problem mit Vererbung Java Basics - Anfänger-Themen 2
L Taschenrechner Problem Java Basics - Anfänger-Themen 4
I Applikationsserver (WildFly) - Zugriff auf Ressourcen.. Problem mit Pfade Java Basics - Anfänger-Themen 10
A ScheduledExecutorService problem Java Basics - Anfänger-Themen 7
marcelnedza Problem mit Weltzuweisung, JavaKarol Java Basics - Anfänger-Themen 13
XWing Methoden rückgabe Problem? Java Basics - Anfänger-Themen 6
M Erste Schritte Collatz Problem max int Java Basics - Anfänger-Themen 3
M Problem bei verschachtelter for-Schleife bei zweidimensionalen Arrays Java Basics - Anfänger-Themen 3
C GLOOP Problem beim Erstellen der Kamera Java Basics - Anfänger-Themen 9
nelsonmandela Problem bei Ausgabe einer Switch - Case Funktion Java Basics - Anfänger-Themen 5
frager2345 Problem mit Methode Java Basics - Anfänger-Themen 4
L Problem bei Rechnung mit Math.pow Java Basics - Anfänger-Themen 13

Ähnliche Java Themen

Neue Themen


Oben