java.lang.OutOfMemoryError: Java heap space?

java.lang.OutOfMemoryError: Java heap space?

我正在使用 StringBuffer 对象将列表对象写入 CSV 文件,当列表包含的数据较少时,我们的逻辑工作正常,但当列表中的数据量很大时,就会出现问题我收到错误: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)

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

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

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