OutOfMemoryError nicht nachvollziehbar

Maxim6394

Bekanntes Mitglied
Ich hab hier ein kleines Problem das ich nicht nachvollziehen kann, obwohl ich es scheinbar bereits gelöst hab. Trotzdem verstehe ich nicht wieso es auftreten konnte.
Ich hab ein SWT-Programm mit einer loop die dauerhaft updatet und malt, nach nichtmal einer Minute erhalte ich die Meldung Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
mit Verweis auf die Zeile
Java:
byte[] newAlphaData = new byte[src.width*src.height];
in dieser Funktion:
Java:
public static ImageData getPortion(org.eclipse.swt.graphics.Image img, Rectangle src)
	{
		ImageData srcData = img.getImageData();
		
		int bytesPerPixel = srcData.bytesPerLine/srcData.width;
		int destBytesPerLine = src.width*bytesPerPixel;
		
		byte[] newData = new byte[src.width*src.height*bytesPerPixel];
		byte[] newAlphaData = new byte[src.width*src.height];
		
		for(int srcY = src.y, destY=0;srcY<src.y+src.height ;srcY++, destY++)
		{
			for(int srcX = src.x, destX= 0; srcX<src.x+src.width  ;srcX++,destX++)
			{
				System.arraycopy(srcData.data, (srcY*srcData.width+srcX)*bytesPerPixel, newData, destY*destBytesPerLine+destX*bytesPerPixel, bytesPerPixel);
				System.arraycopy(srcData.alphaData, srcY*srcData.width+srcX, newAlphaData, destY*src.width+destX, 1);
			}
		}
		ImageData newImageData =  new ImageData(src.width, src.height, srcData.depth, srcData.palette, destBytesPerLine, newData);
		newImageData.alphaData = newAlphaData;

//		newData=null;
//		newAlphaData=null;
		
		return newImageData;
		
	}

Die auskommentierten Zeilen waren die Lösung, so wie es jetzt ist sehe ich im S-Leak tool dass sich da tausende Image Objekte anhäufen. Wieso wird da etwas nicht freigegeben? Bei SWT ist mir klar dass ich die Objekte die Systemressourcen benutzen wieder mit dispose() entfernen muss, das hab ich auch überall getan wo man es tun muss. Aber wieso muss ich hier den beiden arrays erstmal null zuweisen? mit .clone() die arrays dem Konstruktor zu übergeben hatte keinen Unterschied gemacht.
Wo liegt also das Problem?
 

Deros

Bekanntes Mitglied
zumindest newData steckst du ja direkt in das Objekt newImageData rein, von daher lebt es mindestens so lange wie das Objekt newImageData sofern du nicht selbst eingreifst. Da die Arrays jedesmal neu angelegt werden, werden es halt auch immer mehr...ob das alles wirklich von dir so gewollt ist :bahnhof:
 

Maxim6394

Bekanntes Mitglied
zumindest newData steckst du ja direkt in das Objekt newImageData rein, von daher lebt es mindestens so lange wie das Objekt newImageData sofern du nicht selbst eingreifst. Da die Arrays jedesmal neu angelegt werden, werden es halt auch immer mehr...ob das alles wirklich von dir so gewollt ist :bahnhof:

hab doch geschrieben ich hab auch versucht die arrays mit .clone() zu übergeben, hat aber keinen unterschied gemacht.
 

Topfpflanze

Gesperrter Benutzer
Selbst wenn du die Arrays mit clone übergibtst bleiben die geclonten Objekte solange erhalten wie das Objekt erhalten bleibt was du zurückgibst
 

Maxim6394

Bekanntes Mitglied
Das Programm läuft immernoch nicht länger als ne Minute, danach wurden wohl bereits tausende Image Objekte angelegt, obwohl ich doch jedes mal dispose aufrufe in der loop. kann einer sehen was mit der Funktion nicht stimmt?

s-leak zeigt diese zeile an:
Java:
org.eclipse.swt.graphics.Image img = new org.eclipse.swt.graphics.Image(v.getDisplay(), getPortion(imgData,src));

das befindet sich in der draw funktion die bis zu 30 mal die Sekunde aufgerufen wird, am Ende rufe ich aber für dieses Image Objekt dispose() auf.
 
Zuletzt bearbeitet:

Deros

Bekanntes Mitglied
soweit mir bekannst räumt dispose() nur Swing/AWT-Klassen ab, die Variablen bleiben erhalten und werden erst später vom GarbageCollector abgeräumt und so der Speicher abgeräumt. Du sprengst deinen Speicher aber wahrscheinlich schneller als der GarbageCollector aufgerufen wird. Der läuft ja nicht die ganze Zeit. Wenn dem so ist müsste ein "System.gc();" helfen, wäre aber auch nicht optimal ständig den GarbageCollector laufen zu lassen.
 

VfL_Freak

Top Contributor
Moin,

Wenn dem so ist müsste ein "System.gc();" helfen, wäre aber auch nicht optimal ständig den GarbageCollector laufen zu lassen.
Nicht wirklich !
Dieser händische Aufruf sollte zum einen wirklich vermieden werden!
Zum anderen stellt er aber auch nur eine Art Empfehlung für den Garbage Collector dar, doch "bitte mal aufzuräumen". Es ist keineswegs garantiert, dass dieser (a) auch sofort anläuft und (b) dem Speicher auch wirklich aufräumt (sind weiterhin Referenzen auf Objekte vorhanden, so werden diese weiterhin nicht aus dem Speicher gelöscht!!).

Um Speicherlecks zu suchen, sollte man einen Profiler einsetzen - etwa jvisualvm (Home ? Project Kenai) oder jconsole (Using JConsole - Java SE Monitoring and Management Guide)!!

Gruß
Klaus
 
Zuletzt bearbeitet:

Maxim6394

Bekanntes Mitglied
das Problem war dass ich die img Variable vor dem disposen noch einmal mit einem neuen Image Objekt überschrieben hab und die Ressource die in der alten drin war dann wohl nicht mehr erreichbar war.
musste dann die für das neue Image Objekt benötigten Objekte rausnehmen und vorher dispose aufrufen und dann nochmal am Ende.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B OutOfMemoryError kommt nicht/Bug in Java? Allgemeine Java-Themen 2
H Apache fop - OutOfMemoryError Allgemeine Java-Themen 10
L Java OutOfMemoryError Java heap space Allgemeine Java-Themen 3
reibi OutOfMemoryError bei Behandlung von BufferedImage's Allgemeine Java-Themen 6
E OutOfMemoryError bei Verschlüsselungsalgorithmus Allgemeine Java-Themen 3
L java.lang.OutOfMemoryError: Java heap space Allgemeine Java-Themen 10
H java.lang.OutOfMemoryError bei der wiederholten Erzeugng von Threads Allgemeine Java-Themen 8
D OutOfMemoryError:Java hep space Allgemeine Java-Themen 7
M OutOfMemoryError in nebenläufigen Threads Allgemeine Java-Themen 6
C nach ca. 1 Stunde OutOfMemoryError Allgemeine Java-Themen 15
Shoox OutOfMemoryError Allgemeine Java-Themen 10
J Crawler selbst geschreiben: OutOfMemoryError Allgemeine Java-Themen 14
A OutOfMemoryError: Java heap space Allgemeine Java-Themen 11
K OutOfMemoryError: Java heap space troz -Xms1024m Allgemeine Java-Themen 2
P OutOfMemoryError beim XML erstellen bzw parsen, mehr RAM? Allgemeine Java-Themen 4
R OutofMemoryError bei CharArraywriter Allgemeine Java-Themen 5
F OutOfMemoryError: Java heap space - Speicher verändern Allgemeine Java-Themen 8
J java Thread java.lang.OutOfMemoryError: Java heap space Allgemeine Java-Themen 7
B OutOfMemoryError und Arraylisten Allgemeine Java-Themen 2
G Error: java.lang.OutOfMemoryError: Java heap space Allgemeine Java-Themen 2
S java.lang.OutOfMemoryError: Java Allgemeine Java-Themen 22
M java.lang.OutOfMemoryError Allgemeine Java-Themen 2
F java.lang.OutOfMemoryError: Java heap space Allgemeine Java-Themen 22
S fehlermeldung java.lang.OutOfMemoryError Allgemeine Java-Themen 5
G outOfMemoryError beim Einlesen einer Datei abfangen? Allgemeine Java-Themen 13
H Skalieren von Image -> java.lang.OutOfMemoryError - WARUM Allgemeine Java-Themen 18
G jTable-Problem --> java.lang.OutOfMemoryError Allgemeine Java-Themen 5
F java.lang.OutOfMemoryError Allgemeine Java-Themen 13
C OutOfMemoryError lokalisieren Allgemeine Java-Themen 9
M java.lang.OutOfMemoryError Allgemeine Java-Themen 7
T jva.lang.OutOfMemoryError Allgemeine Java-Themen 8
F java.lang.OutOfMemoryError Allgemeine Java-Themen 17
Zrebna Wieso sollte man Null-Prüfungen nicht mit Optional-Objekten nutzen? Allgemeine Java-Themen 13
kodela Textfeld nicht rechteckig Allgemeine Java-Themen 10
G Doppelklick auf Javaprogramm klapt nicht Allgemeine Java-Themen 1
W Timer terminiert nicht Allgemeine Java-Themen 5
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
W Überflüssige Deklaration vermeiden...war da nicht mal was? Allgemeine Java-Themen 3
N lwjgl kann textureSampler nicht finden Allgemeine Java-Themen 4
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
T .Jar kann man nicht ausführen Allgemeine Java-Themen 18
P JDK nicht installiert in Net Object Fusion Allgemeine Java-Themen 7
D Image bewegt sich nicht nach Klicken auf Button Allgemeine Java-Themen 15
N Regex schlägt nicht an Allgemeine Java-Themen 10
Y Wieso krieg ich die Unit Tests nicht hin Allgemeine Java-Themen 55
D Erste Schritte Mp3 Datei kann nicht von der Festplatte geöffnet werden - mit ChatGPT erstellt Allgemeine Java-Themen 7
G Popup wird nicht sichtbar Allgemeine Java-Themen 9
8u3631984 Funktions Parameter mit Lombok "NonNull" annotieren wird in Jacococ Testcoverage nicht herausgefiltert Allgemeine Java-Themen 3
kodela String kann nicht zu Pfad konvertiert werden Allgemeine Java-Themen 16
M Apache Proxy Weiterleitung auf Tomcat funktioniert nicht wie gewünscht Allgemeine Java-Themen 1
Momo16 Brauche Hilfe - Java Projekt kann nicht erstellt werden Allgemeine Java-Themen 12
OnDemand ApacheCommon FTP Client zuckt nicht Allgemeine Java-Themen 3
T JavaPoet - (noch) nicht existente Typen Allgemeine Java-Themen 2
E Es ist nicht möglich, eine Batch-Anweisung auszuführen. Allgemeine Java-Themen 9
C Was passt hier nicht bei der Calendar-Class Allgemeine Java-Themen 2
T Testing JUnit5: try ... catch arbeitet nicht sauber Allgemeine Java-Themen 6
W While Schleife funktioniert nicht ganz Allgemeine Java-Themen 4
OnDemand MemoryLeak nicht zu finden Allgemeine Java-Themen 26
torresbig Website login Problem - Jsoup, wie bisher, klappt nicht! Allgemeine Java-Themen 31
H do-while Schleife funktioniert nicht wie ich es möchte Allgemeine Java-Themen 7
ERlK JDA Code funktioniert nicht? Allgemeine Java-Themen 4
OnDemand Ram Freigabe erfolgt nicht nach Prozessende Allgemeine Java-Themen 18
OnDemand XML desializing Attribute bringt nicht erwartetes Ergebnis Allgemeine Java-Themen 16
T ImageIcon wird nicht angezeigt Allgemeine Java-Themen 6
N JAVA-Code mit Grafikfenster zeichnet in Windows, aber nicht Mac. Allgemeine Java-Themen 4
stormyark TikTakToe funktioniert nicht Allgemeine Java-Themen 10
N Warum wird die For Schleife nicht betreten Allgemeine Java-Themen 4
Tiago1234 Hauptklasse konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 38
T Remove bei ArrayList funktioniert nicht Allgemeine Java-Themen 2
M Map<String,String>funktioniert nicht richtig Allgemeine Java-Themen 4
I "Neues" Lizenzmodell Oracle - JRE nicht mehr zur Redistribution freigegeben? Allgemeine Java-Themen 16
J c Programm läuft nicht in compilierter Version des Java Projektes Allgemeine Java-Themen 7
A code wird nicht ausgeführt Allgemeine Java-Themen 3
Blender3D Alte Beiträge nicht mehr vorhanden Allgemeine Java-Themen 6
M Warum hat Java dieses und jenes nicht... Allgemeine Java-Themen 8
W Bilder werden in App mit Jar-Datei nicht angezeigt Allgemeine Java-Themen 15
Micha43 Applet *.jar läuft nicht auf dem Mac Allgemeine Java-Themen 8
M Warum bekommen ich den Result nicht ? Allgemeine Java-Themen 17
Kiki01 Häufigster Buchstabe lässt sich nicht ermitteln Allgemeine Java-Themen 30
OnDemand RegEx /compilebekomme nicht die erwarteten Werte Allgemeine Java-Themen 9
HerrBolte Seltsamer Fehler nur in der Windows- und nicht in der Java-Console O_O Allgemeine Java-Themen 16
P String.replace() funktioniert nicht? Allgemeine Java-Themen 3
N nicht einsehbarer Fehler im code, kann nicht mehr übersetzten Allgemeine Java-Themen 51
P Karate API Test läuft nicht durch . initializationError Allgemeine Java-Themen 21
N nicht static und auch nicht new Allgemeine Java-Themen 3
Z macOS java konnte nicht entfernt werden xpc verbindungsfehler Allgemeine Java-Themen 4
T Schaltfläche wird nicht gefunden Allgemeine Java-Themen 4
boschl2000 Springerproblem-Implementierung funktioniert nicht richtig Allgemeine Java-Themen 1
F Getter Methode aufrufen funktioniert nicht Allgemeine Java-Themen 1
N Gierigen Regex in nicht-gierigen umwandeln Allgemeine Java-Themen 4
N Regulärer Ausdruck funktioniert nicht Allgemeine Java-Themen 6
AleXusher Hauptklasse startlösung konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 1
G @PostConstruct Annotation nicht mehr gültig ? Allgemeine Java-Themen 7
L Objekte in Set nicht gefunden Allgemeine Java-Themen 13
T Projekt baut nicht mehr/lässt sich nicht mehr ausführen Allgemeine Java-Themen 6
izoards log4j2 will nicht.... Allgemeine Java-Themen 15
Tobero Meine Funktion für das beinhalten eines Punktes in einem Kreis funktioniert nicht Allgemeine Java-Themen 5
1Raini Java if-Abfrage funktioniert nicht! Allgemeine Java-Themen 3
D Firebase retrieve data Problem, Child Element wird nicht angesprochen Allgemeine Java-Themen 0

Ähnliche Java Themen

Neue Themen


Oben