Search code examples
javafilecsvstringbuffer

java.lang.OutOfMemoryError: Java heap space?


I am writing list object's into a CSV file by using StringBuffer object, when the list contains less data our logic is working perfectly but when there is a large amount of data the in list then there's a problem and I get the error: java.lang.OutOfMemoryError: Java heap space problem

Code snippet as follows :

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());
}

Error is :

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)

Could you please look into above code snippet and help me, it would be great help.


Solution

  • Where does column get initialized? I don't see it. But it seems that's a likely culprit. You are building a string array without clearing it out. column[i++] . Where do you clear out that array? It should be scoped to the loop body, not outside of it. So inside loop, declare your String[] column and use it within that scope.