Java Saxon-转换时内存不足

Java Saxon-转换时内存不足,java,xml,memory,heap,saxon,Java,Xml,Memory,Heap,Saxon,我需要帮助,试图找出在执行转换时内存异常的原因 代码如下: Transformer transformer = cachedXSLT.newTransformer(); String strXMLInput = this.toString(); StringReader xmlReader = new StringReader(strXMLInput); transformer.transform(new StreamSource(xmlReader), result); 其中cachedXS

我需要帮助,试图找出在执行转换时内存异常的原因

代码如下:

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)
分析堆its表明,堆主要由ByteArrayOutputStream占用

在Introscope中显示的堆大约为60%时,会生成java堆空间


有什么想法吗?

你在这里提出了同样的问题

我引述我的答案:

Saxon在内部不使用任何
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
输出的警告消息的目标。您是否已重定向此输出

你还没有说你使用的是哪一个撒克逊版本:从行号上看,它看起来像一个旧版本


消除模板规则中的模糊性可能是一个好主意,以避免出现警告消息:在模板规则上放置优先级属性,其中多个规则可以匹配同一节点。

是否可以包含JVM参数?还有,您正在处理的数据集有多大?@因为它是一个企业环境,我甚至不知道JVM参数,我只知道每个JVM都有1.5GB的计算空间。数据集将在每次请求时进行动态更改。请发布一个以获得更好的帮助。