2017-10-17 1 views
-1

変換を実行するときにメモリ例外が発生する原因を突き止めるのに役立つ必要があります。Saxon - 変換時にメモリが不足する

コードは、このです:

cachedXSLTはテンプレートであり、javax.xml.transform.Result

をもたらすログがこれを示す

Transformer transformer = cachedXSLT.newTransformer(); 
String strXMLInput = this.toString(); 
StringReader xmlReader = new StringReader(strXMLInput); 
transformer.transform(new StreamSource(xmlReader), 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が割り当てられています。データセットは各リクエストごとに変更されます –

+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が出力するメッセージを警告するための送信先であるように思われます。あなたはおそらくこの出力をリダイレクトしましたか?

あなたは使用しているSaxonのバージョンについては言及していません。古いバージョンのようですが、行番号で判断してください。

テンプレートルールのあいまいさを取り除いて、警告メッセージが表示されないようにすることをお勧めします。複数のルールが同じノードに一致するテンプレートルールに優先度属性を設定する。