# Java Heap space Probleme



## MQue (25. Jun 2007)

Hallo,


Ich habe mehrere *.svg- dateien auf einem JFrame. Wenn ich das Programm starte hat der JFrame eine Größe von 400*500. Wenn ich jetzt den JFrame auf die maximale Größe vergrößere, dann bekomme ich folgenden Fehler:


```
java.lang.OutOfMemoryError: Java heap space
        at java.awt.image.DataBufferInt.<init>(DataBufferInt.java:41)
        at java.awt.image.SinglePixelPackedSampleModel.createDataBuffer(SinglePixelPackedSampleModel.java:220)
        at java.awt.image.Raster.createWritableRaster(Raster.java:938)
        at org.apache.batik.gvt.renderer.StaticRenderer.updateWorkingBuffers(Unknown Source)
        at org.apache.batik.gvt.renderer.StaticRenderer.clearOffScreen(Unknown Source)
        at org.apache.batik.swing.gvt.GVTTreeRenderer.run(Unknown Source)
```

Ich glaube es liegt daran, dass sich die *.svg- Dateien in dem JFrames anpassen (und dadurch größer werden und dadurch eben der Heap- Speicher zu klein wird. 

Weiß da villeicht jemand eine Abhilfe?


Vielen Dank

lg
Michl


----------



## The_S (25. Jun 2007)

Ja, die heapSize erhöhen. Ansonsten zeig mal Code, evtl. haste ja irgendwo nen kleinen Fehler bzw. man kann noch was optimieren ...


----------



## Gast (25. Jun 2007)

gönn der jvm mehr heap speicher (-Xvm #).

oder lös das svg vom jframe, so dass es seine größe nicht mehr ändert.

oder greif in den jframe dementsprechend ein, dass nur der zur darstellung benötigte ausschnitt aus der svg entsprechend vergrößert wird.


----------



## Gast (25. Jun 2007)

wobei mir grad einfällt; ist svg nicht ein vektorgrafik format? wieso belegt das mehr speicher, wenns vergrößert wird? schmeiss die konvertierung in pixel weg


----------



## MQue (25. Jun 2007)

Mein Code zum holen der *.svg- Datei und zum darstellen auf den verschiedenen JPanels schaut so aus:


(Wie könnte ich den heap von Java (bzw. von der JVM) vergößern?

```
for (int i = 0; i < 8; i++)
	    {
                 File f = new File(System.getProperty("user.dir") + "\\pics\\" + vector1.elementAt(i).getIcon());
                 JPanel = new JSVGCanvas();
                    try {
                        JPanel.setURI(f.toURL().toString());
                        } 
                    catch (IOException ex) 
                        {
                        ex.printStackTrace();
                        } 
                JPanel.setBounds(10,10, 400, 300);                    
                JPanel.setOpaque(true);
                   
                JPanel.setLayout(null);
                JPanel.setBounds(i*200, i*200, 200, 200);   // i*200 steht nur so da jetzt, in meinem Code werden sie anders angeordnet            
                }
        
            }
```


----------



## The_S (25. Jun 2007)

Variablen schreibt man nach wie vor klein. Und vorallem benennt man sie nicht exakt so, wie auch Klassen heißen. Das verwirrt nur. Desweiteren ist mir keine Klasse bekannt, die SVGCanvas heißt. Woher hast du die?

Wie man den Heap erhöht hat dir schon der Gast gesagt. Außerdem darfst auch du die Forensuche verwenden!


----------



## MQue (25. Jun 2007)

Erstens hab ich JPanel umbenannt für dieses Forum, hab auf das nicht geachtet dass es jetzt JPanel heißt (heißt beim mir svgPanel),
Mir ist schon klar, das variablen kein anfangen und mit KamelReitern fortfahren!!
und zweitens: 
import org.apache.batik.swing.JSVGCanvas;

Wie mach ich das mit der IDE NetBeans, kann ich da den Java Heap auch irgendwei vergrößern oder muss ich das in die Dos- Box eintippseln?

Vielen dank für die Hilfe


----------



## The_S (25. Jun 2007)

Michael1234 hat gesagt.:
			
		

> Erstens hab ich JPanel umbenannt für dieses Forum, hab auf das nicht geachtet dass es jetzt JPanel heißt (heißt beim mir svgPanel)



warum benennst du das um :shock: ?



			
				Michael1234 hat gesagt.:
			
		

> und zweitens:
> import org.apache.batik.swing.JSVGCanvas;



Ist trotzdem keine Standardklasse! Soll jetzt der User, der gewillt ist dir zu helfen, sich erst noch über Google deine Libs zusammensuchen? :roll:



			
				Michael1234 hat gesagt.:
			
		

> Wie mach ich das mit der IDE NetBeans, kann ich da den Java Heap auch irgendwei vergrößern oder muss ich das in die Dos- Box eintippseln?



puh sorry, kA. Verwende hier Eclipse, geht aber bestimmt irgendwie. Versuchs mal mit Google und "Netbeans + HeapSize"  .


----------



## me.toString (25. Jun 2007)

Also eigentlich benutzte ich eclipse ... hab aber netbeans hier noch rumfliegen und mal reingeschaut (aber net getestet) ... und da kannst du die Einstellung folgendermaßen machen: 
Rechtsklick auf das Projekt - Properties auswählen - unter "Run" kannst du dann die VM-Options ändern


----------



## MQue (25. Jun 2007)

> warum benennst du das um :shock: ?



weil ich mir dachte, es wird dann einfacher zu lesen aber das Gegenteil war anscheinend der Fall.


import org.apache.batik.swing.JSVGCanvas; ist keine Standardklasse, ich hab mir die *.jars von der Seite http://xmlgraphics.apache.org/batik/ heruntergeladen, um *.svg- Dateien darstellen zu können, Stamdardmäßig unterstützt java ja nur *.jpeg und *.png so weit ich weiß. *.svg wird auf keinen Fall unterstützt (standardmäßig)
 herzlichen Dank für die Antworten,


lg


----------



## MQue (27. Jun 2007)

mein Problem ist ja auch, dass ich das im Programm machen muss, sonst hab ich ja das Problem, dass ich das Projekt weitergebe und dort die Vergrößerung auch wieder gemacht werden muss.

ich hab keine Ahnung, wieso mir die *.svg- Dateien den heap so anfüllen.

Gibts da eine Abhilfe?

lg
Michl


----------



## MQue (27. Jun 2007)

Kann ich den Heap irgendwie leeren oder den GC mal drüberfahren lassen,

Gibts da keine Möglichkeit?

lg und vielen Dank


----------



## The_S (27. Jun 2007)

der gc läuft automatisch. Du kannst ihn zwar anregen mal drüberzugucken, ob und wann er das macht, kannst du aber nicht beeinflussen. Und wenn du nichts machst, als ein Fenster mit Bild anzuzeigen, kannste da wohl net viel an Heap einsparen  .


----------



## byte (27. Jun 2007)

System.gc();

Aber das wird nicht viel helfen. Denn der OutOfMemoryError kommt erst, wenn der GC schon aktiv war. Die JVM wird standardmäßig mit ner Heapsize von 64 MB gestartet. Wenn das zuwenig ist, dann musst Du wohl oder übel aufstocken.


----------



## MQue (27. Jun 2007)

jin NetBeans kann man den Heap nicht größer als 64k machen.
Sobald ich -Xms65m schreibe, mag die IDE nicht mehr, bei -Xms64m gehts noch.

Was ich nicht verstehe ist, dass ich z.B.: 3 *.svg- Bilder öffne, diese 3 Bilder wieder schließe, dann andere 2 aufmachen möchte und dann kommt eben die Exception.
Kann es sein dass die *.svg- Bilder im Heap bleiben, denn wenn ich die ersten 3 Bilder noch mal aufmache, passiert nichts.

Das ist mir überhaupt nicht klar.

Vielleicht hat da jemand eine Idee.

lg
Michl


----------



## The_S (27. Jun 2007)

Wenn du ohne schließen gleich 5 svg Bilder aufmachst, kommt vermutlich auch die Exception oder? Dann hast du die 3 svg Bilder vorher nicht wieder zerstört ...


----------



## byte (27. Jun 2007)

-Xms setzt das Minimum. Mach: -Xmx128m


----------



## MQue (27. Jun 2007)

wie kann ich die 3 Bilder wieder zerstören?


----------



## The_S (27. Jun 2007)

Wie zerstörst du sie denn momentan?


----------



## MQue (27. Jun 2007)

mit -Xmx128m gehts jetzt, dann ist mein Programm aber nicht plattformunabhängig!?


----------



## The_S (27. Jun 2007)

Michael1234 hat gesagt.:
			
		

> ich hab ein JTabbedPane -> mit removeAll



Dann entfernst du nur die Componenten vom JTabbedPane, die Componenten an sich existieren aber natrülich weiter!



			
				Michael1234 hat gesagt.:
			
		

> mit -Xmx128m gehts jetzt, dann ist mein Programm aber nicht plattformunabhängig!?



warum das denn :shock: ?


----------



## MQue (27. Jun 2007)

ja bin jetzt auch gerade draufgekommen, ich entferne ja nur die Tabs und nicht die Componenten,


was meinst du mit warum das denn icon_eek.gif ?

der heap ist größer und daher kann ich mehr *.svg- Bilder aufmachen.


----------



## The_S (27. Jun 2007)

ne, warum sollte dein Programm durch einen größeren Heap Plattformabhängig werden ???:L ? 

Brauchst du denn immer alle Bilder im Heap? Kannst du nicht "leere" Tabs erzeugen und erst beim Klicken auf einen Tab das entsprechende Bild laden und das aus dem vorhergehenden löschen?


----------



## MQue (27. Jun 2007)

Wenn ich bei der Entwicklung den Heap vergrößern muss und da sProjekt dann weitergebe, dann tritt ja wieder das alst Problem auf, da dort vielleicht der Heap wieder nur auf 64k eingestellt ist.

Ich werds jetzt, wie du geschrieben hast, einzeln laden.


Ich lade mom. meine Bilder so wie unten, wie kann ich das *.svg- Bild wieder zerstören bzw. entladen?


```
File f = new File(System.getProperty("user.dir") + "\\pics\\" +myPfad);
                    try {
                        myPanel.setURI(f.toURL().toString());  // hier lade ich das Bild aber wie "entlade" ich es wieder
                        } 
                    catch (IOException ex) 
                        {
                        ex.printStackTrace();
                        }
```

lg und Danke


----------



## The_S (27. Jun 2007)

Der Heap wird ja nicht vom Betriebssystem vorgegeben, sondern immer beim start der JVM mit angegeben.


----------



## MQue (27. Jun 2007)

Hättest du eine Idee, wie ich die *.svg- Datei wieder wegbekomme (entlade, zerstöre)?
Oben hab ich den Code hingeschrieben, wie ich die *.scg- Datei lade


----------



## The_S (27. Jun 2007)

Schau mal hier

http://www.morgenlan.de/yapata/content/oom-common/oom-1.shtml


----------

