Hallo,
ich bin mit folgendem Verhalten konfrontiert: Ich habe ein Programm, das mit Fremdkomponenten org.w3c.dom.Document Objekte austauscht und erstelle an einer Stelle ein solches Dokument über JAXP (also ich serialisiere ein Objekt nach XML). Dies funktionierte plötzlich letztens nicht mehr und es liegt an der größeren Input-Datenmenge. Das Problem war, dem auf die Schliche zu kommen, denn eine entsprechende Exception ist nicht geflogen, sondern alle Kerne waren plötzlich voll ausgelastet.
Zuerst habe ich versucht zu debuggen, und das Verhalten tritt einige Sekunden nach dem Aufruf von
auf. Laut VisualVM hat der Heap noch Luft und die CPU macht nichts, aber der Taskmanager zeigt einen XMX Speicherverbrauch und eine Last von 100% auf allen Kernen bei javaw.exe.
Das Verhalten gibt es so auf mehreren Systemen mit 1.7 und auch 1.8. Auch nach 12h kommt es zu keiner Exception.
Weil ich den Marshaller nicht debuggen konnte, hab ich die Serialisierung nach XML gleich selbst mit dem DOM "Parser" gemacht: Gleiches Ergebnis, aber eine Schleifenvariable zeigte mir dass es rasend schnell bis zu einer bestimmten Grenze ging und dann jeder Schleifendurchlauf etwas langsamer wurde. Anfangs 10000/sek, rapide langsamer werdend in den Bereich von 1/sek und später 1/min. Dh, irgendwie läuft mein Programm noch, allerdings ultralangsam gegen unendlich. Die Grenze an der es langsamer wird kam abrupt.
Nächster Schritt: XML mit SAX in Bytearray schreiben und dann mit DOM einlesen: Sax läuft durch aber dann beim einlesen ins DOM: gleiches Ergebnis.
Obwohl ich mir dank VisualVM sicher war, es könne nicht am Speicher liegen, hab ich den in Schritten erweitert:
2G: oben beschriebenes Verhalten bei 1,7G
4G: oben beschriebenes Verhalten bei 3,5G
6G: oben beschriebenes Verhalten bei 5G
8G: läuft durch mit Peak bei ca 5G
Es gibt also eindeutig ein Speicherproblem und ich bekomme bei entsprechender Datenmenge und zu kleiner XMX Config auch einen OutOfMemoryError zB vom SAX geworfen, aber beim JAXP/DOM eben nicht. Interessant ist, dass im Kritischen Moment 3 weitere Threads gestartet werden (so dass alle 4 Kerne ausgelastet sind) VisualVM keine Last und weniger Speicherverbrauch anzeigt, aber im Taskmanager javaw.exe den Speicher und die Kerne auslastet. Es fühlt sich für mich an, wie ein Bug in der VM bei der Speicherallozierung im Heap, allerdings bisher nur bei der Benutzung des DOM bzw JAXP (was vermutlich nur ein Wrapper dafür ist).
Google hat nicht geholfen, deswegen: Hat jemand vielleicht dafür auch nur den Ansatz einer Erklärung?
ich bin mit folgendem Verhalten konfrontiert: Ich habe ein Programm, das mit Fremdkomponenten org.w3c.dom.Document Objekte austauscht und erstelle an einer Stelle ein solches Dokument über JAXP (also ich serialisiere ein Objekt nach XML). Dies funktionierte plötzlich letztens nicht mehr und es liegt an der größeren Input-Datenmenge. Das Problem war, dem auf die Schliche zu kommen, denn eine entsprechende Exception ist nicht geflogen, sondern alle Kerne waren plötzlich voll ausgelastet.
Zuerst habe ich versucht zu debuggen, und das Verhalten tritt einige Sekunden nach dem Aufruf von
Java:
javax.xml.bind.Marshaller.marshal(object, document);
Das Verhalten gibt es so auf mehreren Systemen mit 1.7 und auch 1.8. Auch nach 12h kommt es zu keiner Exception.
Weil ich den Marshaller nicht debuggen konnte, hab ich die Serialisierung nach XML gleich selbst mit dem DOM "Parser" gemacht: Gleiches Ergebnis, aber eine Schleifenvariable zeigte mir dass es rasend schnell bis zu einer bestimmten Grenze ging und dann jeder Schleifendurchlauf etwas langsamer wurde. Anfangs 10000/sek, rapide langsamer werdend in den Bereich von 1/sek und später 1/min. Dh, irgendwie läuft mein Programm noch, allerdings ultralangsam gegen unendlich. Die Grenze an der es langsamer wird kam abrupt.
Nächster Schritt: XML mit SAX in Bytearray schreiben und dann mit DOM einlesen: Sax läuft durch aber dann beim einlesen ins DOM: gleiches Ergebnis.
Obwohl ich mir dank VisualVM sicher war, es könne nicht am Speicher liegen, hab ich den in Schritten erweitert:
2G: oben beschriebenes Verhalten bei 1,7G
4G: oben beschriebenes Verhalten bei 3,5G
6G: oben beschriebenes Verhalten bei 5G
8G: läuft durch mit Peak bei ca 5G
Es gibt also eindeutig ein Speicherproblem und ich bekomme bei entsprechender Datenmenge und zu kleiner XMX Config auch einen OutOfMemoryError zB vom SAX geworfen, aber beim JAXP/DOM eben nicht. Interessant ist, dass im Kritischen Moment 3 weitere Threads gestartet werden (so dass alle 4 Kerne ausgelastet sind) VisualVM keine Last und weniger Speicherverbrauch anzeigt, aber im Taskmanager javaw.exe den Speicher und die Kerne auslastet. Es fühlt sich für mich an, wie ein Bug in der VM bei der Speicherallozierung im Heap, allerdings bisher nur bei der Benutzung des DOM bzw JAXP (was vermutlich nur ein Wrapper dafür ist).
Google hat nicht geholfen, deswegen: Hat jemand vielleicht dafür auch nur den Ansatz einer Erklärung?