BufferedImage verursacht OutOfMemoryError

Status
Nicht offen für weitere Antworten.

Fats

Bekanntes Mitglied
Hallo zusammen!

Ich versuche mit
Code:
new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
ein Bild zu erzeugen. Prinzipiel klappt das auch ganz gut. Lediglich wenn die Werte für Höhe und Breite etwas größer werden (> 8000x1600), dann bekomme ich die Fehlermeldung
Code:
java.lang.OutOfMemoryError: Java heap space

Ich hab schon gefunden, daß man zB. mit
Code:
java -Xmx 300m Klassenname
den Heap vergrößern könnte, aber ist das der richtige Weg?

Viele Grüße
Fats
 

The_S

Top Contributor
Ja, du hast in diesem Buffered-Image pro Pixel 4 Farbkanäle á 1 Byte. Macht bei einer Größe von 8000*1600 knapp 50MB. Entweder musste dein BufferedImage stückweise bearbeiten oder eben den heap erhöhen (je nach Anforderung).
 

Fats

Bekanntes Mitglied
"Stückweise bearbeiten" .. hmm ... *grübel* ... wie meinst Du das? Ich stell mir das jetzt so vor, daß ich wie mit Papier und Schere zB. mein Bild in 4 Teile "zerschneide". Links oben, rechts oben, links unten und rechts unten. Habe ich dann am Ende 4 Einzelbilder, sprich vier einzelne Dateien, oder kommt dabei wieder ein ganzes Bild raus??
Ich glaube, ich hätte Schwierigkeiten festzustellen, ob links oben das komplette "Hallo" steht oder zB. nur "Hall" und das "o" schon auf der rechten Seite liegt .... da leg ich mir glaub ich die Karten ...

Viele Grüße
Fats
 

The_S

Top Contributor
Ohne genauen Hintergrund, wie du an das Bild kommst (aus Datei laden, selber generieren) und was du damit machen willst (anzeigen, speichern, ...), kann ich dir hier nur schlecht helfen ;) .
 

Fats

Bekanntes Mitglied
Ay ;) Also das Bild wird selbst erzeugt, und ich will es sowohl anzeigen als auch speichern. Wobei in dieser großen Auflösung muß es nicht zwangsläufig angezeigt werden, aber ich finds zum Testen ganz gut ...

Hier ein paar Zeilen :

Code:
BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = img.createGraphics();             
g2d.setColor(Color.RED);
g2d.drawString("Hallo Echo",10,20);
g2d.dispose();       
ImageIO.write(img, image_type, new File(filename));
ImageIO.write(image, image_type, out);

(Out ist ein OutputStream, und wird von einem Servlet durchgereicht ...)

Vielen Dank
Fats
 

The_S

Top Contributor
Wenn du das Bild speichern willst, kommst du nicht drum herum (es sei denn du schreibst das Bild Stückchenweise in die Datei, was du aber selber implementieren müsstest) irgendwann mal im Code das BufferedImage als ganzes zu behandeln => HeapSize erhöhen.
 

Fats

Bekanntes Mitglied
Ich muß doch noch mal kurz nachhaken. Wenn ich es recht verstanden habe, dann muß ich die HeapSize für eine spezielle Klasse ändern - also in meinem Fall für die Klasse java.awt.image.BufferedImage, richtig?

Demnach würde der Aufruf in der Console lauten

Code:
java -Xmx100m java.awt.image.BufferedImage

Aber dabei erhalte ich folgende Meldung:

Code:
Exception in thread "main" java.lang.NoSuchMethodError: main

Was mache ich falsch?

Viele Grüße
Fats
 

The_S

Top Contributor
Du musst die HeapSize für die ganze VM setzen. Also beim Starten deines Programms einfach nach dem java die heapsize setzen.
 

Fats

Bekanntes Mitglied
Hmmm ... Das ganze ist letztendlich ne Webanwendung. Wenn ich Dich recht verstehe, dann müsste ich das irgendwie mit dem Tomcat verbasteln ... nur wie? Gibt es dafür eine Umgebungsvariable, die man wie das Catalina_Home setzen muß? Hast Du zufällig davon Ahnung? Sonst stell ich die Frage nochmal im Enterprise Forum ...
 

The_S

Top Contributor
puuh ... ich programmier zwar beruflich Portlets, aber das mit WebSphere Rational Application Developer und selbst da musste ich noch nie die HeapSize verändern. Sry, kA stell besser mal ins J2EE Forum, denk mal KSG9|Sebastian hat davon Ahnung ;) .
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B BufferedImage Position Spiele- und Multimedia-Programmierung 8
B BufferStrategy zu BufferedImage? Irgendwie? Spiele- und Multimedia-Programmierung 2
D getsubimage aus BufferedImage und Rueckwandlung in ein ImagePlus bild Spiele- und Multimedia-Programmierung 0
V BufferedImage[] aus anderer Classe auslesen Spiele- und Multimedia-Programmierung 2
F [JMyron] Bild von int[] zu BufferedImage Spiele- und Multimedia-Programmierung 2
Q BufferedImage vs. Heap Space ‒ Warum wird der Speicher nicht freigegeben? Spiele- und Multimedia-Programmierung 6
M Performance Problem bei BufferedImage Spiele- und Multimedia-Programmierung 7
R BufferedImage > Integer.MAX_VALUE Spiele- und Multimedia-Programmierung 9
M Pixel eines BufferedImage bearbeiten (Performance) Spiele- und Multimedia-Programmierung 23
G BufferedImage -> Farbe wechselt willkürlich Spiele- und Multimedia-Programmierung 15
P int-Array zu BufferedImage (performance?) Spiele- und Multimedia-Programmierung 14
agentone BufferedImage transparent löschen Spiele- und Multimedia-Programmierung 12
radiac Stringtext mit BufferedImage Textur. Spiele- und Multimedia-Programmierung 6
kowa BufferedImage und Antialias Spiele- und Multimedia-Programmierung 2
T BufferedImage#setRGB #getRGB zu langsam Spiele- und Multimedia-Programmierung 4
J Zeichnen in BufferedImage und dieses in Datei speichern Spiele- und Multimedia-Programmierung 2
A Image in BufferedImage konvertieren Spiele- und Multimedia-Programmierung 2
Z Transparenz in BufferedImage Spiele- und Multimedia-Programmierung 8
Z JME - Rendering in BufferedImage Spiele- und Multimedia-Programmierung 14
A Bildbereich als BufferedImage Spiele- und Multimedia-Programmierung 3
M BufferedImage blass machen Spiele- und Multimedia-Programmierung 5
Lulumann6 BufferedImage in VolatileImage casten Spiele- und Multimedia-Programmierung 10
P Rotation von BufferedImage (Affine Transformation) Spiele- und Multimedia-Programmierung 7
S Image to BufferedImage Spiele- und Multimedia-Programmierung 3
P Java Sound OutOfMemoryError Spiele- und Multimedia-Programmierung 2
J Zu viele Objekte - OutOfMemoryError Spiele- und Multimedia-Programmierung 3

Ähnliche Java Themen

Neue Themen


Oben