2017-10-17 52 views
-1

我需要幫助,試圖找出進行轉換時可能導致內存異常的原因。Saxon - 轉換時內存不足

的代碼是這樣的:

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

凡cachedXSLT是一個模板,並導致javax.xml.transform.Result中一個

日誌顯示此:

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) 

分析堆其顯示堆主要被ByteArrayOutputStream佔用

什麼可能一旦在Introscope中使用的堆大約60%,就會生成Java堆空間。

任何想法?

+0

你可以包含你的JVM參數嗎?此外,您正在處理的數據集有多大? – bated

+0

@bated由於這是一個企業環境,我甚至不知道JVM參數,我所知道的是每個JVM都有1.5GB的分區。該數據集將在每個請求dinamically –

+0

請發佈[mcve]以獲得更好的幫助。 – kjhughes

回答

0

您在這裏提出了同樣的問題

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

我引用我的回答:

撒克遜不使用任何ByteArrayOutputStream實例內部;我認爲唯一的例子就是你(可能)提供的變形結果。結果有多大?你爲什麼把結果放在ByteArrayOutputStream中?

其實看着堆棧跟蹤我們:

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) 

所以這裏ByteArrayOutputStream似乎是由StandardErrorListener警告消息輸出目的地。你有沒有重定向這個輸出?

你還沒有說過你使用的撒克遜版本:它看起來像一箇舊的,由行號來判斷。

擺脫模板規則中的歧義以避免警告消息可能是個好主意:在模板規則中放置優先級屬性,其中多個規則可以匹配相同的節點。