java.lang.OutOfMemoryError:java堆空间?
我使用java.lang.OutOfMemoryError:java堆空间?,java,file,csv,stringbuffer,Java,File,Csv,Stringbuffer,我使用StringBuffer对象将列表对象写入CSV文件,当列表包含的数据较少时,我们的逻辑工作正常,但当列表中有大量数据时,出现问题,我得到错误:java.lang.OutOfMemoryError:java堆空间问题 代码片段如下所示: StringBuffer report = new StringBuffer(); String[] column = null; StringReader stream = null; for (MassDetailReportDto dto: newL
StringBuffer
对象将列表对象写入CSV文件,当列表包含的数据较少时,我们的逻辑工作正常,但当列表中有大量数据时,出现问题,我得到错误:java.lang.OutOfMemoryError:java堆空间问题
代码片段如下所示:
StringBuffer report = new StringBuffer();
String[] column = null;
StringReader stream = null;
for (MassDetailReportDto dto: newList.values()) {
int i = 0;
column = new String[REPORT_INDEX];
column[i++] = dto.getCommodityCode() == null ? " " : dto.getCommodityCode();
column[i++] = dto.getOaId() == null ? " " : dto.getOaId();
//like this we are calling some other getter methods
//After all getter methods we are appending columns to stringBuffer object
report.append(StringUtils.join(column, PIPE));
report.append(NEW_LINE);
//now stringbuffer object we are writing to file
stream = new StringReader(report.toString());
int count;
char buffer[] = new char[4096];
while ((count = stream.read(buffer)) > -1) {
//writing into file
writer.write(buffer, 0, count);
}
writer.flush();
//clearing the buffer
report.delete(0, report.length());
}
错误是:
java.lang.OutOfMemoryError: Java heap space
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:99)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:393)
at java.lang.StringBuilder.append(StringBuilder.java:120)
请你们看看上面的代码片段并帮助我,这将是巨大的帮助 当列表大小足够大时,出现内存不足错误似乎是合乎逻辑的。增加JVM堆大小(使用
-Xmx
和-Xms
JVM参数)可以暂时解决这个问题。但是,理想情况下,您应该使用分页访问列表中项目的源。如果列表是从数据库或Web服务填充的,则可以轻松地以分页方式访问。列在哪里初始化?我看不出来。但这似乎是罪魁祸首。您正在构建一个字符串数组,但没有清除它<代码>列[i++]。你在哪里清除那个阵列?它的作用域应该是循环体,而不是循环体之外。所以在循环内部,声明您的String[]列
,并在该范围内使用它 您可以使用java
的-Xmx
选项来增加堆空间。例如:java-Xmx1024m Main
您可以根据上面的注释增加java可用的内存量。或在for
循环的每次迭代中,当您将列表写入writer
时,您可以查看您的逻辑并考虑是否确实需要将整个列表放入report
中。此外,当您提供的代码片段无法编译时,很难帮助您了解查询的细节-您有列
数组设置为null,但随后尝试使用列[i++]=..
设置其元素。此外,未定义i
。您能确保提供可编译的吗?是的,Richard,我们已经增加了堆大小,我们必须将total list对象写入文件!!我们已经定义了所有参数,即使它只适用于少量的dat,这是一个只有大量数据的问题。上面的代码是示例代码。这个代码看起来很奇怪。除了前面提到的问题之外:您创建了一个StringBuffer
,将所有数据附加到其中,唯一的目的是在以后将该SringBuffer
的内容写入OutputStream
。为什么不直接写到流中呢?使用BufferedWriter,而不是自己滚动。发布工作代码,而不是复制和粘贴不可能是您正在运行的代码。我们已将JVM堆大小增加到1GB,但仍然面临问题!!。。对于写入文件后的每一行,我们正在清除缓冲区,但不了解问题的确切位置!!但是列表中的对象本身确实占用了堆空间。所以,最好以分页方式访问它们。这不是堆大小,而是代码。他显然是在要求OOM。是的,我在第一篇帖子后看到了。我修改了答案以反映它。感谢Madconan,我们正在创建字符串数组,其中for循环列=new string[REPORT_INDEX];但我没把它寄出去。代码段已修改,请检查一次。