Memory Leak mit BufferedImage !!

Status
Nicht offen für weitere Antworten.

2crank

Mitglied
Hallo zusammen,

Code:
	@Override
	public void actionPerformed(ActionEvent e) {
		
		Object o = e.getSource();
		
		if ( o == delete ) {
			staticScreenImg.flush();
			staticScreenImg = null;
			System.gc();
		}
		else if ( o == create ) {
			try {
				// 390 x 5286
				staticScreenImg = ImageIO.read(new File("D://CODEZ//Java//IndexCardProgram//staticImage.png"));
			}
			catch (IOException e1) {
				e1.printStackTrace();
			}
		}
	}

Nach dem erzeugen des BufferedImage steigt der verbrauchte RAM von ca 9.532 auf ca. 18.340.

Problem: Wenn ich das BufferedImage mit flush und der Zuweisung von null wieder aus dem Speicher haben will passiert nichts, der Speicher bleibt auf 18.340. Ich bin absolut verzweifelt und weiss nichtmehr weiter. Bitte helft mir :)
 

madboy

Top Contributor
Meines Wissens ist nicht garantiert, wann und ob überhaupt der GarbageCollector aufräumt und Speicher wieder frei gibt.
Wenn du kein wirkliches Problem mit dem Speicher (wie z.B. OutOfMemoryExceptions o.ä.) hast, würde ich das einfach ignorieren.

Wie schaust du nach dem Speicherverbrauch? Glaube schon mal gehört zu haben, dass der Taskmanager von Windows nicht immer korrekte Werte anzeigt.
 

hdi

Top Contributor
Eig. sollte der Speicher frei gemacht worden sein. System.gc() ist zwar in der Tat nur eine "Bitte", keine Garantie, aber in der Praxis tut er's halt doch immer (zumindest war es bei mir immer so). Vgl. repaint() und co.

Ich würde mal java-intern überprüfen, wie es mit dem Speicher aussieht, weil ja madboy meinte der TaskManager zeigt das vllt nicht richtig an.

Wie war das nochmal, ich glaube die Klasse Runtime, bzw die Singleton Instanz, hat dafür Methoden, um den Speicherbedarf der JVM anzuzeigen.
 

musiKk

Top Contributor
Den Speicherbedarf mit Betriebssystemmitteln zu prüfen, ist nicht zweckmäßig. Die Instanz einer JVM alloziert dynamisch bis zu einer Maximalgröße Speicher, wenn sie ihn benötigt. Wird ein großes Objekt wieder freigegeben, ist es nicht unbedingt sinnvoll, den Speicher der JVM wieder zu verringern (ich weiß nicht, ob sie das überhaupt jemals tut). Immerhin ist das Allozieren von Speicher eine vergleichsweise teure Angelegenheit.

Wenn Du wissen willst, wie die JVM den Speicher selbst nutzt, so sei Dir VisualVM ans Herz gelegt. Dort kann der GC auch manuell angestoßen werden. Der Nutzen von System.gc() hingegen ist mir noch schleierhaft. Das benötigt man eigentlich nie.
 

Noctarius

Top Contributor
Den Speicherbedarf mit Betriebssystemmitteln zu prüfen, ist nicht zweckmäßig. Die Instanz einer JVM alloziert dynamisch bis zu einer Maximalgröße Speicher, wenn sie ihn benötigt. Wird ein großes Objekt wieder freigegeben, ist es nicht unbedingt sinnvoll, den Speicher der JVM wieder zu verringern (ich weiß nicht, ob sie das überhaupt jemals tut). Immerhin ist das Allozieren von Speicher eine vergleichsweise teure Angelegenheit.

Nein tut sie nicht. Die JVM vergrößert den Speicherbereich bis -Xmx (also max Speicher) aber gibt niemals wieder welchen frei in der Annahme, dass ein Programm nicht nur einmal Unmengen an Speicher benötigt sondern die selbe Operation schon öfter auftreten wird.
 

musiKk

Top Contributor
Joah, ich meine das auch im Hinterkopf gehabt zu haben, war mir aber nicht mehr sicher. Klingt aus o. a. Grund imho auch nach einer sinnvollen Strategie.
 

Guybrush Threepwood

Top Contributor
Ist ein älterer Thread, aber ich stehe gerade vor dem selben Problem. Der Speicher läuft mit der Zeit voll und und irgendwann fliegt eine OutOfMemory. Bei der Verwendung von BufferedImages mit Alpha-Kanal gibt es mit der Zeit auf manchen Rechnern einen fatalen Fehler und die ganze JVM crasht. Das ist bei mir auf einem etwas älteren Rechner mit WinXP der Fall (ich habe mir heute den ganzen Tag die Zähne ausgebissen). Das ist wirklich ein sehr unerfreuliches Problem, da ich in einer Anwendung mit vielen großen Bildern mit Transparenz arbeite. Insbesondere die Bilder mit Transparenz scheinen dabei ein besonderes Problem darstellen, aber auch BufferedImages ohne Alpha-Kanal.

Offensichtlich ist ein Memory-Leak in der Graphik-Pipeline und das Video-RAM ist irgendwann erschöpft. Wenn man die Hardware-Beschleunigung abschaltet, dann crasht zumindest die JVM nicht mehr, aber der Speicher läuft dennoch voll. Auch wenn man wirklich alle Bilder nach Gebrauch "flusht", bleibt das Problem bestehen. Es gibt dazu Einträge in der Bug-Datenbank bei Oracle.
 

Noctarius

Top Contributor
Wenn du einen OutOfMemory bekommst dann kann der GC den Speicher nicht mehr freigeräumen weil du irgendwo einen Memory-Leak hast. Dies passiert oft durch vergessene Referenzen in Lists / Maps / Arrays.
 

Guybrush Threepwood

Top Contributor
Hi Noctarius,
der Speicher läuft bei der Verwendung von BufferedImages mit Alpha-Kanal voll, selbst wenn man alle Referenzen explizit aufräumt, alle Bilddaten mit flush() freigibt etc. Das ist ein Bug in der JVM (siehe Stack Overflow-Eintrag), und er ist deshalb eine blöde Sache, weil Grafikdaten einfach sehr viel Speicher in Anspruch nehmen. Sonst läuft meine Anwendung völlig tadellos und fühlt sich auch sehr flüssig an.
Es scheint sich wirklich um ein prinzipielles Problem zu handeln, (siehe z. B. auch Bug ID: 6716560 BufferedImage scaling leaks memory )
 
M

maki

Gast
Der Bug Report bezieht sich auf das JDK 1.5.0_12, hast du das Problem auhc mit einer aktuellen JRE/JDK?
 

Guybrush Threepwood

Top Contributor
Ja, leider. Ich verwende 1.6.0_23. Mit der Option -Dsun.java2d.d3d=false crasht die JVM zumindest nicht mehr, aber der Speicher läuft trotzdem voll, obwohl explizit mit flush (BufferedImage), bzw. dispose (Graphics2D) alle zugehörigen Ressourcen freigegeben werden, und auch sonst keine Referenzen existieren.
 

Guybrush Threepwood

Top Contributor
Nachtrag: Das Problem scheint wohl dann aufzutreten, wenn man bei einem BufferedImage mit Alpha-Kanal die createGraphics-Methode aufruft. Ohne Alpha-Kanal ist es offensichtlich kein Problem. Den Crash konnte ich auf Windows Vista und Windows 7 nicht replizieren. Das ist vermutlich ein Problem, das bei WinXP auftritt, möglicherweise in Verbindung mit dem Grafikkartentreiber.
Der Speicherverbrauch sinkt darüber hinaus, wenn man nach dem Flush zusätzlich das Image-Objekt auf null setzt.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
eskimo328 Java6 Methode in Java5 verwenden (memory leak JInternalFrame) AWT, Swing, JavaFX & SWT 4
K JavaFX Memory Spiel AWT, Swing, JavaFX & SWT 12
B Memory Spielerwechsel AWT, Swing, JavaFX & SWT 4
E showAndWait is not allowed during animation or layout processing Memory FX AWT, Swing, JavaFX & SWT 2
C Memory Karten nach Paar offen bleiben sonst wieder umdrehen AWT, Swing, JavaFX & SWT 1
N Hilfe bei Memory-Spiel AWT, Swing, JavaFX & SWT 18
B Swing Memory-Spiel AWT, Swing, JavaFX & SWT 2
M Swing Memory Spiel in Eclipse AWT, Swing, JavaFX & SWT 5
P WM 2006 - The Memory Game :P läuft nicht. AWT, Swing, JavaFX & SWT 15
S Speicher Leak durch Tabellenaktualisierung AWT, Swing, JavaFX & SWT 5
N Countdown verursacht Speicher Leak AWT, Swing, JavaFX & SWT 7
I Arbeitsspeicherverbrauch BufferedImage.TYPE_INT_RGB vs. TYPE_3BYTE_BGR AWT, Swing, JavaFX & SWT 6
H BufferedImage zurücksetzen funktioniert nicht AWT, Swing, JavaFX & SWT 12
L AWT Ändern der Farbe eines BufferedImage mit Farbähnlichkeit AWT, Swing, JavaFX & SWT 5
I GEmaltes BufferedImage löschen AWT, Swing, JavaFX & SWT 3
cool_brivk24 BufferedImage einem ClickEvent hinzufügen AWT, Swing, JavaFX & SWT 13
cool_brivk24 AWT BufferedImage wird nicht geladen AWT, Swing, JavaFX & SWT 17
J linken Bildausschnitt eines BufferedImage abschneiden AWT, Swing, JavaFX & SWT 4
Zar von Domarus JFrame zu BufferedImage konvertieren AWT, Swing, JavaFX & SWT 3
S 2D-Grafik User-BufferedImage rotieren im Zentrum und ohne "anpassung" AWT, Swing, JavaFX & SWT 2
C Pixel-Rendering/Animation Performance in BufferedImage AWT, Swing, JavaFX & SWT 1
H Swing BufferedImage zeichnen AWT, Swing, JavaFX & SWT 1
C Swing BufferedImage zeichnen und JLabels setzen. AWT, Swing, JavaFX & SWT 17
G Subimage von BufferedImage speichern AWT, Swing, JavaFX & SWT 4
D JPanel Graphic2D als BufferedImage Speichern AWT, Swing, JavaFX & SWT 5
D BufferedImage -> Feature Extraktion. Unterschiedliche BufferedImage imageTypes problem AWT, Swing, JavaFX & SWT 4
I 2D-Grafik Shape aus BufferedImage "löschen" AWT, Swing, JavaFX & SWT 2
M 2D-Grafik LookupOp Operation auf BufferedImage AWT, Swing, JavaFX & SWT 7
GianaSisters 2D-Grafik BufferedImage.getSubimage - Frage AWT, Swing, JavaFX & SWT 7
P BufferedImage schlechte Qualität beim Abspeichern AWT, Swing, JavaFX & SWT 9
S BufferedImage als schwarz-weiß-Bild AWT, Swing, JavaFX & SWT 3
Luk10 BufferedImage[...].getData() vs BufferedImage.setRGB() AWT, Swing, JavaFX & SWT 2
D Schnelles kopieren von Pixeln in ein BufferedImage AWT, Swing, JavaFX & SWT 25
J Flackern wie mit BufferedImage beheben AWT, Swing, JavaFX & SWT 4
N Swing BufferedImage neu laden AWT, Swing, JavaFX & SWT 10
N 2D-Grafik BufferedImage, Line2D, Swing und die Probleme AWT, Swing, JavaFX & SWT 5
Luk10 BufferedImage auf ein anderes BufferedImage zeichnen AWT, Swing, JavaFX & SWT 6
P BufferedImage auf JPanel AWT, Swing, JavaFX & SWT 11
K 2D-Grafik BufferedImage eingelesen, welches Modell?! AWT, Swing, JavaFX & SWT 2
T BufferedImage bei paintComponent AWT, Swing, JavaFX & SWT 6
C 2D-Grafik BufferedImage laden, Frage zum Code AWT, Swing, JavaFX & SWT 2
0x7F800000 2D-Grafik int[] zu BufferedImage konvertieren AWT, Swing, JavaFX & SWT 27
H 2D-Grafik BufferedImage aus Integer-Array AWT, Swing, JavaFX & SWT 3
Luk10 2D-Grafik BufferedImage sauber rotieren AWT, Swing, JavaFX & SWT 16
P Image mehrfach in ein BufferedImage zeichnen AWT, Swing, JavaFX & SWT 7
A BufferedImage nach dem Speichern immer schwarz AWT, Swing, JavaFX & SWT 8
J Bild aus Datei in BufferedImage laden AWT, Swing, JavaFX & SWT 4
E BufferedImage Alphaknal ein- und ausblenden AWT, Swing, JavaFX & SWT 7
N BufferedImage zeichnen AWT, Swing, JavaFX & SWT 4
D BufferedImage Größe skalieren AWT, Swing, JavaFX & SWT 2
P Swing Vom BufferedImage bei paintComponent nur soviel zeichnen, wie nötig AWT, Swing, JavaFX & SWT 3
B 2D-Grafik BufferedImage Performance AWT, Swing, JavaFX & SWT 3
Y frage zu BufferedImage AWT, Swing, JavaFX & SWT 7
E AWT RenderedImage aus BufferedImage erzeugen, um Bild abzuspeichern? AWT, Swing, JavaFX & SWT 4
S Unterscheiden ob ein Graphics-Objekt von einer JComponent oder einem BufferedImage kommt..? AWT, Swing, JavaFX & SWT 4
A 2D-Grafik BufferedImage wird nicht eingezeichnet AWT, Swing, JavaFX & SWT 3
G 2D-Grafik BufferedImage Hintergrund immer schwarz AWT, Swing, JavaFX & SWT 4
Developer_X Swing Auf ein BufferedImage mit Graphics/Graphics2D zeichnen AWT, Swing, JavaFX & SWT 6
J AWT BufferedImage to 2DArray AWT, Swing, JavaFX & SWT 10
R Bild drehen UND skalieren (Image bzw BufferedImage) AWT, Swing, JavaFX & SWT 5
J JPanel in Bufferedimage AWT, Swing, JavaFX & SWT 3
1 BufferedImage in byte[], dann in String und zurück AWT, Swing, JavaFX & SWT 7
J Swing paintComponent() - repaint() - BufferedImage anzeigen AWT, Swing, JavaFX & SWT 5
C BufferedImage-Fehler? Falsches Bild wir gezeichnet AWT, Swing, JavaFX & SWT 5
B BufferedImage Builder AWT, Swing, JavaFX & SWT 15
F Transparentes BufferedImage über BufferedImage AWT, Swing, JavaFX & SWT 12
F Größe von BufferedImage ändern AWT, Swing, JavaFX & SWT 27
I Swing JComponent als BufferedImage speichern AWT, Swing, JavaFX & SWT 18
Dragonfire Swing Zoom-Vorgang optimieren [BufferedImage] AWT, Swing, JavaFX & SWT 2
X BufferedImage maximiert in JFrame anzeigen? AWT, Swing, JavaFX & SWT 2
R JPanel - BufferedImage - zeichnen großer Bilder AWT, Swing, JavaFX & SWT 2
R JTable - TableCellRenderer - BufferedImage AWT, Swing, JavaFX & SWT 9
D BufferedImage und Graphics2D AWT, Swing, JavaFX & SWT 3
R Zeichnen von Zahlen in BufferedImage AWT, Swing, JavaFX & SWT 6
G BufferedImage.getRGB() mit 3 int-Werten vergleichen AWT, Swing, JavaFX & SWT 2
Luma BufferedImage wird nicht gezeichnet AWT, Swing, JavaFX & SWT 3
G keine ScaledInstance von BufferedImage? AWT, Swing, JavaFX & SWT 6
S BufferedImage & Scaling: Altes Problem im neuen Gewand AWT, Swing, JavaFX & SWT 2
G zu viele/große BufferedImage führt zu Java heap space AWT, Swing, JavaFX & SWT 5
G BufferedImage und jpg --> maximale Qualität AWT, Swing, JavaFX & SWT 9
F HTML Text irgendwie auf BufferedImage bringen AWT, Swing, JavaFX & SWT 3
R BufferedImage Problem AWT, Swing, JavaFX & SWT 2
G Problem mit BufferedImage und imageIO AWT, Swing, JavaFX & SWT 2
S BufferedImage drehen AWT, Swing, JavaFX & SWT 3
? ActionListener auf BufferedImage AWT, Swing, JavaFX & SWT 11
M BufferedImage mit html interpretierten String beschriften AWT, Swing, JavaFX & SWT 3
A Probelme mit großen BufferedImage in paintComponent AWT, Swing, JavaFX & SWT 7
B Farbtiefe eines BufferedImage verringern AWT, Swing, JavaFX & SWT 3
F ImageIcon -> BufferedImage AWT, Swing, JavaFX & SWT 2
T Performance Problem bei BufferedImage AWT, Swing, JavaFX & SWT 3
F Animiertes Gif als BufferedImage AWT, Swing, JavaFX & SWT 10
L Anzeigen von fotos: ImageIcon oder BufferedImage + paint() ? AWT, Swing, JavaFX & SWT 5
C Rotate BufferedImage --> Bild unvollständig AWT, Swing, JavaFX & SWT 5
U Streifen hinter bewegtem BufferedImage AWT, Swing, JavaFX & SWT 13
M BufferedImage skalieren AWT, Swing, JavaFX & SWT 6
T BufferedImage verkleinern Resultat ist zu pixelig. AWT, Swing, JavaFX & SWT 6
G Image Object speichern oder in ein BufferedImage umwandeln AWT, Swing, JavaFX & SWT 2
P Problem beim Zeichnen auf ein BufferedImage AWT, Swing, JavaFX & SWT 4
B BufferedImage aus einer Datei AWT, Swing, JavaFX & SWT 4
C Farben in BufferedImage ändern ? AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben