java.lang.OutOfMemoryError:Java堆空间?

时间:2015-03-12 11:42:54

标签: java file csv stringbuffer

我正在使用StringBuffer对象将列表对象写入CSV文件,当列表包含的数据较少时,我们的逻辑工作正常但是当列表中有大量数据时,那么& #39;一个问题,我收到错误:java.lang.OutOfMemoryError: Java heap space problem

代码段如下:

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)

请您查看上面的代码片段并帮助我,这将是很有帮助的。

2 个答案:

答案 0 :(得分:0)

当列表大小足够大时,这似乎是合乎逻辑的内存错误。增加JVM堆大小(使用-Xmx和 - Xms jvm args)可以暂时解决问题。但是,理想情况下,您应该使用页面访问列表中项目的源。如果列表是从数据库或Web服务填充的,则可以通过分页方式轻松访问它。

答案 1 :(得分:0)

column在哪里初始化?我没有看到它。但似乎这可能是罪魁祸首。您正在构建一个字符串数组而不清除它。 column[i++]。你在哪里清理那个阵列?它应该作为循环体的范围,而不是它的外部。因此在内部循环中,声明您的String[] column并在该范围内使用它。