错误内存VM java,java.lang.OutOfMemoryError:java堆空间
朋友们,我需要你们的帮助,我必须处理一个非常大的文件,文件信息重30 Mb。在处理此信息文件时,java给了我以下错误:错误内存VM java,java.lang.OutOfMemoryError:java堆空间,java,performance,jvm,Java,Performance,Jvm,朋友们,我需要你们的帮助,我必须处理一个非常大的文件,文件信息重30 Mb。在处理此信息文件时,java给了我以下错误: Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:2367) at java.lang.AbstractStringBuilder.expandCapacity(Ab
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2367)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:130)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:114)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:535)
at java.lang.StringBuffer.append(StringBuffer.java:322)
at java.io.StringWriter.write(StringWriter.java:94)
at java.io.Writer.write(Writer.java:127)
at com.sun.org.apache.xml.internal.serialize.Printer.printText(Printer.java:170)
.....
我的代码是:
...
public Document generateXML(File file, String type) {
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbf.newDocumentBuilder();
Document document = docBuilder.newDocument();
Element rootElement = document.createElement("data");
document.appendChild(rootElement);
Element informacionElement = document.createElement("information");
rootElement.appendChild(informacionElement);
Element entityElement = document.createElement("entity");
entityElement.appendChild(document.createTextNode("ANYTHING"));
informacionElement.appendChild(entityElement);
Element entityCode = document.createElement("code");
entityCode.appendChild(document.createTextNode(0000));
informacionElement.appendChild(entityCode);
Element fileElement = document.createElement("FILENAME");
fileElement.appendChild(document.createTextNode(file.getName()));
informacionElement.appendChild(fileElement);
Element detailElement = document.createElement("detail");
rootElement.appendChild(detailElement);
Path path = Paths.get(file.getAbsolutePath());
Scanner tmpFile = new Scanner(path, StandardCharsets.UTF_8.name());
String[] tmpTags = keyXml.get(type);
int row = 1;
while (tmpFile.hasNextLine()) {
Element rowElement = document.createElement("row");
filaElement.setAttribute("id", Integer.toString(row));
Scanner tmpLine = new Scanner(tmpFile.nextLine());
tmpLine.useDelimiter("\\|");
int index = 0;
while (tmpLine.hasNext()) {
Element element = document.createElement(tmpTags[index]);
String text = tmpLine.next().trim();
element.appendChild(document.createTextNode(text));
filaElement.appendChild(element);
++index;
}
detailElement.appendChild(filaElement);
++fila;
}
return document;
} catch (ParserConfigurationException | IOException ex) {
Logger.getLogger(HandlerXML.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
...
此代码生成以下XML文档:
<data>
<information>
<entity>ANYTHING</entity>
<code>0000</code>
<filename>filename_XXX</filename>
</information>
<detail>
<row id="1">
<tag1>0099</tag1>
<tag2>2014</tag2>
<tag3>05</tag3>
<tag4>0015</tag4>
<tag5>06</tag5>
<tag6>06</tag6>
<tag7>000000000099907</tag7>
<tag8>098026</tag8>
<tag9>00000781.40</tag9>
<tag10>E</tag10>
<tag11>000000006804750</tag11>
<tag12>xxx</tag12>
<tag13>xxxx</tag13>
<tag14>xxx</tag14>
<tag15></tag15>
<tag16></tag16>
<tag17>xx</tag17>
<tag18>xxx</tag18>
<tag19>1014</tag19>
<tag20>05</tag20>
<tag21>11111</tag21>
<tag22>1014</tag22>
<tag23>00000000000000000000</tag23>
<tag24>3</tag24>
<tag25>20101</tag25>
<tag26>00000000</tag26>
<tag27>46671</tag27>
<tag28>1</tag28>
<tag29>N</tag29>
<tag30></tag30>
<tag31></tag31>
<tag32>A</tag32>
<tag33></tag33>
<tag34></tag34>
<tag35></tag35>
<tag36></tag36>
<tag37></tag37>
<tag38></tag38>
</row>
............
</detail>
</data>
获取xml数据的word是:
**2014年9月14日,2014年10月14日,2014年10月14日第四四四四四四四周四周四周四周四周四周四周五周五周五周五周五周五周四周四周四周四周四周四周四周四周四周四周四周四周四周四周四周五周五周五周五周五周五周五周五周五周五周四周四周四周四周四周四周四周四周四周四周五周五周五周五周五周五周五周六周六周六周六周六周六周六周六周六周六周六周六周六周六周六周六周六周六周六周六周六周六周六周六周六周六周六周六周六周六周六周六周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周六周六周六周六周六周六周六周六周六周六周六周六周六周六周六周六周六周六周六周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日周日|**
现在假设必须为100000行信息生成xml,如果您想知道的话,所有行都必须转换为xml格式
问题是,当您将对象转换为字符串到文档时,我得到了前面显示的错误,我用于将文档转换为字符串的函数是:
现在这个错误是虚拟内存,java VM的解决方法是使用-Xmxm增加内存,但是我想知道是否可以用另一种方法解决这个问题,尝试使用:String、StringBuilder和byte来处理数据类型。谁能解决这个问题
提前感谢。非常大的文件并不表示您的程序将使用非常大的内存。这更可能意味着您可能会花费相当多的时间来处理文件,但实际上与您使用的空间没有多大关系 只有文件的当前相关部分应保留在内存中 但奎斯知道这是否可以通过另一种方式解决 是的,当然还有另一种方法:序列化XML时,不要使用StringWriter作为目标。如果希望XML以文件形式结束,那么为其创建一个适当的FileWriter,并将其交给XML序列化代码
如果您从异常的stacktrace中包含更多内容,我可能会给您比上面更精确的建议。产生异常的实际代码也会有所帮助。30MB实际上并没有那么大 建议:将其添加到Java命令行:-XX:MaxPermSize=512m 此外: 一定要熟悉Java分析器。它随JDK一起提供 下面是一篇解决此类问题的好文章:
“希望有帮助 你能发布你的代码吗?请告诉我们你在这些大文件上做的是什么样的操作,有可能在流式传输数据时做相同的操作,而不是将数据放在ram中。不知道你在做什么是无法帮助的。对不起,如果我表达得不好,而且不提供太多信息30MB是非常大的文件吗?以前,我还是个孩子的时候,现在这是一个笑话。自从Java 7以后,就没有PermGen了。;它仍然可以被耗尽。主要的一点是鼓励OP确定问题的确切原因。两个强烈的建议:1学习使用或等效,2阅读
private static String convertDocumentToString(Document doc) {
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer;
try {
transformer = tf.newTransformer();
StringWriter writer = new StringWriter();
transformer.transform(new DOMSource(doc), new StreamResult(writer));
return writer.getBuffer().toString();
}
catch (TransformerException e) {}
return "";
}