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];但我没把它寄出去。代码段已修改,请检查一次。