【发布时间】:2015-05-14 13:18:27
【问题描述】:
我正在使用 StringBuffer 对象将列表对象写入 CSV 文件,当列表包含的数据较少时,我们的逻辑工作正常,但是当列表中有大量数据时,就会出现问题,我得到了错误:java.lang.OutOfMemoryError: Java heap space problem
代码sn-p如下:
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)
能否请您查看上面的代码 sn-p 并帮助我,这将是很大的帮助。
【问题讨论】:
-
您可以使用
java的-Xmx选项来增加堆空间。例如:java -Xmx1024m Main -
您可以根据上面的评论增加 Java 可用的内存量。或者,您可以查看您的逻辑并考虑是否真的需要在
for循环的每次迭代中将整个列表写入writer时将其放入report。 -
另外 - 当您提供的 sn-p 无法编译时,很难帮助您提供查询的详细信息 - 您将
column数组设置为 null 但然后尝试使用column[i++] = ....此外,i未定义。你能确保你提供一个可编译的Minimal, complete and verifiable example吗? -
是的,理查德,我们增加了堆大小,我们必须将总列表对象写入文件!我们已经定义了所有参数,即使它适用于少量数据,只有大量数据存在问题。以上代码为示例代码。
-
这段代码看起来很奇怪。除了已经提到的问题:您创建了一个
StringBuffer,您将所有数据附加到该SringBuffer的唯一目的是稍后将SringBuffer的内容写入OutputStream。为什么不直接写入流?使用 BufferedWriter 而不是自己滚动。并发布工作代码,而不是复制粘贴的内容,这不可能是您正在运行的代码。
标签: java file csv stringbuffer