避免在处理大型xml时使用TransformerFactory转换方法发生的OutOfMemory错误

时间:2018-09-24 19:19:21

标签: java performance xml-parsing sax stax

当我使用内存分析器工具分析堆转储文件时,它显示以下代码(转换方法)作为OutOfMemory错误的根本原因。下面的代码段:

env:

下面的内存分析器工具stacktrace:

public static String xmlToString(Node node) throws TransformerException
    {
            Source source = new DOMSource(node);
            StringWriter stringWriter = new StringWriter();
            Result result = new StreamResult(stringWriter);
            TransformerFactory factory = TransformerFactory.newInstance();
            Transformer transformer = factory.newTransformer();
            transformer.setOutputProperty(OutputKeys.METHOD, "xml");
            transformer.setOutputProperty(OutputKeys.INDENT,"yes");
            transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "3");
            transformer.transform(source, result);
            return stringWriter.getBuffer().toString();
    }

我们无法更改此方法签名at java.lang.OutOfMemoryError.<init>()V (OutOfMemoryError.java:48) at java.util.Arrays.copyOf([CI)[C (Arrays.java:3332) at java.lang.AbstractStringBuilder.ensureCapacityInternal(I)V (AbstractStringBuilder.java:124) at java.lang.AbstractStringBuilder.append(C)Ljava/lang/AbstractStringBuilder; (AbstractStringBuilder.java:649) at java.lang.StringBuffer.append(C)Ljava/lang/StringBuffer; (StringBuffer.java:381) at java.io.StringWriter.write(I)V (StringWriter.java:77) at org.apache.xml.serializer.ToStream.writeAttrString(Ljava/io/Writer;Ljava/lang/String;Ljava/lang/String;)V (ToStream.java:2155) at org.apache.xml.serializer.ToStream.processAttributes(Ljava/io/Writer;I)V (ToStream.java:2079) at org.apache.xml.serializer.ToStream.closeStartTag()V (ToStream.java:2623) at org.apache.xml.serializer.ToStream.characters([CII)V (ToStream.java:1410) at org.apache.xalan.transformer.TransformerIdentityImpl.characters([CII)V (TransformerIdentityImpl.java:1124) at org.apache.xml.serializer.TreeWalker.dispatachChars(Lorg/w3c/dom/Node;)V (TreeWalker.java:246) at org.apache.xml.serializer.TreeWalker.startNode(Lorg/w3c/dom/Node;)V (TreeWalker.java:416) at org.apache.xml.serializer.TreeWalker.traverse(Lorg/w3c/dom/Node;)V (TreeWalker.java:145) at org.apache.xalan.transformer.TransformerIdentityImpl.transform(Ljavax/xml/transform/Source;Ljavax/xml/transform/Result;)V (TransformerIdentityImpl.java:390) at com.something.StringUtil.xmlToString(Lorg/w3c/dom/Node;)Ljava/lang/String; (StringUtil.java:76) ,因为此方法已在许多地方使用。

这里的问题,通过修改此方法有什么办法可以避免OOM错误?处理xml时,此方法应消耗较少的内存。就是通过用其他任何方法替换String xmlToString(Node node)?还是使用transformer.transform(source, result)方法中的SAX或STAX源而不是DOM源?

使用的进口:

xmlToString(Node node)

0 个答案:

没有答案