我正在使用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)
请您查看上面的代码片段并帮助我,这将是很有帮助的。
答案 0 :(得分:0)
当列表大小足够大时,这似乎是合乎逻辑的内存错误。增加JVM堆大小(使用-Xmx
和 - Xms
jvm args)可以暂时解决问题。但是,理想情况下,您应该使用页面访问列表中项目的源。如果列表是从数据库或Web服务填充的,则可以通过分页方式轻松访问它。
答案 1 :(得分:0)
column
在哪里初始化?我没有看到它。但似乎这可能是罪魁祸首。您正在构建一个字符串数组而不清除它。 column[i++]
。你在哪里清理那个阵列?它应该作为循环体的范围,而不是它的外部。因此在内部循环中,声明您的String[] column
并在该范围内使用它。