2017-10-17 3 views
-1

Ich brauche Hilfe, um herauszufinden, was die Ursache der Speicherausnahme bei einer Umwandlung sein könnte.Saxon - Nicht genügend Arbeitsspeicher beim Umwandeln

Der Code ist dies:

Transformer transformer = cachedXSLT.newTransformer(); 
String strXMLInput = this.toString(); 
StringReader xmlReader = new StringReader(strXMLInput); 
transformer.transform(new StreamSource(xmlReader), result); 

Wo cachedXSLT eine Vorlage und führen eine javax.xml.transform.Result

Das Protokoll zeigt dies:

java.lang.OutOfMemoryError: Java heap space 
at java.util.Arrays.copyOfRange(Arrays.java:4138) 
at java.util.Arrays.copyOf(Arrays.java:3870) 
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:119) 
at java.io.PrintStream.write(PrintStream.java:454) 
at sun.nio.cs.StreamEncoder$CharsetSE.writeBytes(StreamEncoder.java:355) 
at sun.nio.cs.StreamEncoder$CharsetSE.implFlushBuffer(StreamEncoder.java:425) 
at sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:138) 
at java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:187) 
at java.io.PrintStream.write(PrintStream.java:501) 
at java.io.PrintStream.print(PrintStream.java:643) 
at java.io.PrintStream.println(PrintStream.java:780) 
at net.sf.saxon.StandardErrorListener.error(StandardErrorListener.java:210) 
at net.sf.saxon.Controller.recoverableError(Controller.java:865) 
at net.sf.saxon.trans.Mode.reportAmbiguity(Mode.java:593) 
at net.sf.saxon.trans.Mode.getRule(Mode.java:257) 
at net.sf.saxon.trans.RuleManager.getTemplateRule(RuleManager.java:160) 
at net.sf.saxon.instruct.ApplyTemplates.applyTemplates(ApplyTemplates.java:329) 
at net.sf.saxon.instruct.ApplyTemplates$ApplyTemplatesPackage.processLeavingTail(ApplyTemplates.java:527) 
at net.sf.saxon.instruct.ApplyTemplates.applyTemplates(ApplyTemplates.java:317) 
at net.sf.saxon.instruct.ApplyTemplates$ApplyTemplatesPackage.processLeavingTail(ApplyTemplates.java:527) 
at net.sf.saxon.instruct.ApplyTemplates.applyTemplates(ApplyTemplates.java:317) 
at net.sf.saxon.instruct.ApplyTemplates.apply(ApplyTemplates.java:210) 
at net.sf.saxon.instruct.ApplyTemplates.processLeavingTail(ApplyTemplates.java:174) 
at net.sf.saxon.instruct.Block.processLeavingTail(Block.java:556) 
at net.sf.saxon.instruct.Instruction.process(Instruction.java:93) 
at net.sf.saxon.instruct.ElementCreator.processLeavingTail(ElementCreator.java:296) 
at net.sf.saxon.instruct.Choose.processLeavingTail(Choose.java:686) 
at net.sf.saxon.instruct.Block.processLeavingTail(Block.java:556) 
at net.sf.saxon.instruct.Instruction.process(Instruction.java:93) 
at net.sf.saxon.instruct.ElementCreator.processLeavingTail(ElementCreator.java:296) 
at net.sf.saxon.instruct.Block.processLeavingTail(Block.java:556) 
at net.sf.saxon.instruct.Instruction.process(Instruction.java:93) 
at net.sf.saxon.instruct.ElementCreator.processLeavingTail(ElementCreator.java:296) 
at net.sf.saxon.instruct.Block.processLeavingTail(Block.java:556) 
at net.sf.saxon.instruct.Template.applyLeavingTail(Template.java:203) 
at net.sf.saxon.instruct.ApplyTemplates.applyTemplates(ApplyTemplates.java:345) 
at net.sf.saxon.instruct.ApplyTemplates.defaultAction(ApplyTemplates.java:378) 
at net.sf.saxon.instruct.ApplyTemplates.applyTemplates(ApplyTemplates.java:333) 
at net.sf.saxon.Controller.transformDocument(Controller.java:1807) 
at net.sf.saxon.Controller.transform(Controller.java:1621) 

den Heap Analyse es zeigt, dass der Heap ist vor allem von ByteArrayOutputStream besetzt

Was könnte erzeugt den Java-Heap-Space, sobald der in Introscope verwendete Heap ungefähr 60% beträgt.

Irgendwelche Ideen?

+0

Können Sie Ihre JVM-Argumente einbeziehen? Wie groß ist der Datensatz, den Sie verarbeiten? – bated

+0

@bated Da es eine Enterprise-Umgebung ist, kenne ich nicht einmal die JVM-Argumente, alles was ich weiß ist, dass jede JVM 1,5 GB zugewiesen hat. Der Datensatz wird bei jeder Anfrage dynamisch geändert. –

+0

Bitte geben Sie eine [mcve] ein, um eine bessere Hilfe zu erhalten. – kjhughes

Antwort

0

erhoben Sie die gleiche Frage hier

https://saxonica.plan.io/issues/3488

und ich zitiere meine Antwort:

Saxon verwendet keine ByteArrayOutputStream Instanzen intern; Ich denke, die einzigen Fälle sind diejenigen, die Sie (vermutlich) liefern, um das Transformationsergebnis zu halten. Wie groß ist das Ergebnis? Warum setzen Sie das Ergebnis in einen ByteArrayOutputStream?

Eigentlich an dem Stack-Trace suchen wir:

at java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:187) 
at java.io.PrintStream.write(PrintStream.java:501) 
at java.io.PrintStream.print(PrintStream.java:643) 
at java.io.PrintStream.println(PrintStream.java:780) 
at net.sf.saxon.StandardErrorListener.error(StandardErrorListener.java:210) 
at net.sf.saxon.Controller.recoverableError(Controller.java:865) 
at net.sf.saxon.trans.Mode.reportAmbiguity(Mode.java:593) 

so die ByteArrayOutputStream hier scheint das Ziel zu sein für Nachrichten ausgegeben durch die StandardErrorListener warnen. Haben Sie diese Ausgabe vielleicht umgeleitet?

Sie haben nicht gesagt, welche sächsische Version Sie verwenden: Sie sieht nach den Zeilennummern aus wie eine alte Version.

Es kann eine gute Idee sein, die Mehrdeutigkeiten in Ihren Vorlagenregeln zu umgehen, um Warnmeldungen zu vermeiden: Legen Sie ein Prioritätsattribut für Vorlagenregeln fest, in denen mehrere Regeln mit demselben Knoten übereinstimmen.

Verwandte Themen