当我使用内存分析器工具分析堆转储文件时,它显示以下代码(转换方法)作为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)