# Wieso Heap Space Problem?



## Verjigorm (4. Jul 2008)

Hallo, ich habe da eine Frage wegen eines Heap Space Problems.

Wir haben hier ein kleines Java-Tool, welches Firmendaten aufnimmt und diese dann in einer XML-Datei abspeichert. (mit XMLEncoder und Fileoutputstream,...).
Das ging soweit.

Nun sollte es möglich sein eine PDF mit anzuhängen.
Ich lese also die PDF (~200KB) als byte-Array ein. Soweit erstmal keine Probleme.

Beim Speichern der Daten als XML-Datei kommt dabei immer:

Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
	at java.util.IdentityHashMap.resize(IdentityHashMap.java:452)
	at java.util.IdentityHashMap.put(IdentityHashMap.java:428)
	at java.beans.XMLEncoder.getValueData(XMLEncoder.java:447)
	at java.beans.XMLEncoder.writeExpression(XMLEncoder.java:371)
	at java.beans.PersistenceDelegate.writeObject(PersistenceDelegate.java:97)
	at java.beans.Encoder.writeObject(Encoder.java:54)
	at java.beans.XMLEncoder.writeObject(XMLEncoder.java:257)
	at java.beans.Encoder.writeObject1(Encoder.java:206)
	at java.beans.Encoder.cloneStatement(Encoder.java:219)
	at java.beans.Encoder.writeExpression(Encoder.java:278)
	at java.beans.XMLEncoder.writeExpression(XMLEncoder.java:372)
	at java.beans.ArrayPersistenceDelegate.initialize(MetaData.java:106)
	at java.beans.PersistenceDelegate.writeObject(PersistenceDelegate.java:100)
	at java.beans.Encoder.writeObject(Encoder.java:54)
	at java.beans.XMLEncoder.writeObject(XMLEncoder.java:257)
	at java.beans.Encoder.writeExpression(Encoder.java:279)
	at java.beans.XMLEncoder.writeExpression(XMLEncoder.java:372)
	at java.beans.PersistenceDelegate.writeObject(PersistenceDelegate.java:97)
	at java.beans.Encoder.writeObject(Encoder.java:54)
	at java.beans.XMLEncoder.writeObject(XMLEncoder.java:257)
	at java.beans.Encoder.writeExpression(Encoder.java:279)
	at java.beans.XMLEncoder.writeExpression(XMLEncoder.java:372)
	at java.beans.DefaultPersistenceDelegate.doProperty(DefaultPersistenceDelegate.java:212)
	at java.beans.DefaultPersistenceDelegate.initBean(DefaultPersistenceDelegate.java:247)
	at java.beans.DefaultPersistenceDelegate.initialize(DefaultPersistenceDelegate.java:391)
	at java.beans.PersistenceDelegate.writeObject(PersistenceDelegate.java:100)
	at java.beans.Encoder.writeObject(Encoder.java:54)
	at java.beans.XMLEncoder.writeObject(XMLEncoder.java:257)
	at java.beans.Encoder.writeExpression(Encoder.java:279)
	at java.beans.XMLEncoder.writeExpression(XMLEncoder.java:372)
	at java.beans.PersistenceDelegate.writeObject(PersistenceDelegate.java:97)
	at java.beans.Encoder.writeObject(Encoder.java:54)


Ich habe mit dem XMLEncoder noch nie gearbeitet.
Es hiess, ich müsste nur das byte-Array in das Objekt stopfen und das wars.
Derjenige der das Programm geschrieben ist leider in Urlaub 

Kann mir jemand sagen, was da schiefläuft?


----------



## NTB (4. Jul 2008)

Kannst Du ausmachen, an welcher Stelle das genau auftritt und uns Beispielcode posten?
Hast Du schon probiert, den Heap Space zu erhöhen?


----------



## Verjigorm (4. Jul 2008)

Achso ja, vergessen zu erwähnen, der Heapspace steht auf 1024 MB

geschrieben wird das Ganze mit:

```
public void saveFirma(Firma firma, String _file) {
		filename = _file;
		try {
			enc = new XMLEncoder( new FileOutputStream(filename) );
		    enc.writeObject(firma);
		    enc.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} 
	    		
	}
```

wenn keine PDF angehängt ist, gehts wunderbar, nur nicht mit der PDF (als byte-Array)


----------



## Verjigorm (4. Jul 2008)

So habs jetzt mal durchprobiert:
bis ca. 150KB PDF's geht es, danach Heap Space Problem ...

aber wieso ist die Frage?


----------



## Ark (4. Jul 2008)

Kannst du einen Profiler einsetzen?

Ark


----------



## Verjigorm (4. Jul 2008)

Bitte was?


----------



## Ark (4. Jul 2008)

http://de.wikipedia.org/wiki/Profiler_(Programmierung)

Ark


----------



## Atze (7. Jul 2008)

du schreibst die daten in ein xml, soweit ist das je klar, aber was machst du mit dem pdf? anhängen? inwiefern? lust das näher zu erläutern?


----------



## tuxedo (7. Jul 2008)

Wieviele PDFs landen denn in so einer XML? Weil wenn ich mir den Stacktrace so anschaue, dann läuft da irgendwo intern im XMLEncoder eine Hashmap über. Und bei 200kybte und n bisschen "Kleinkram" drum rum, kann ich mir nicht vorstellen dass das den Heap schon zum platzen bringt. 

Tippe also auf eine unsachgemäße Nutzung der Lib. 

- Alex


----------



## Atze (7. Jul 2008)

achso, ok, er schreibt den inhalt des pdfs mit in das xml!? ok, das hört sich plausibel an, das "anhängen" hatte mich ein wenig irritiert 

naja, ein 200 kb mit sehr niedriger quali kann schon einiges an plaintext enthalten, oder nicht?


----------



## tuxedo (7. Jul 2008)

Völlig egal welche Quali die PDF hat. Wenn sie 200Kbyte umfasst sollte das in einer HashMap noch kein Problem sein. Wenn er aber dutzende solcher PDFs in eine XML einbaut, dann ist klar, dass die Sache irgendwann überläuft. 

Wenn es allerdings nur eine PDF pro XML ist, dann wird der XMLEncoder irgendwie nicht richtig verwendet. 

- Alex


----------



## maki (7. Jul 2008)

Warum nimmst du den XMLEncoder? Der ist nur dafür gedacht JavaBeans zu serialisieren, nicht um belibieges XML zu erstellen... dafür nimmt man eine richtige XML API, wie StAX, JDOM, etc. pp.


----------



## Verjigorm (9. Jul 2008)

Der XMLEncoder wird im Programm schon benutz und ich soll halt nur erweitern um eine PDF einzulesen und mit ins XML-Format zu übernehmen.

Aber da das mehr Probleme gemacht hat, als alles andere wirds mit separater pdf gemacht ....


----------



## maki (9. Jul 2008)

Tja, so ist das wenn man Bibliotheken missbraucht


----------



## Verjigorm (9. Jul 2008)

Ist ja nicht mein Programm, ich erweiters nur und muss nehmen was ich kriege


----------

