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
并在该范围内使用它。
我正在使用 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
并在该范围内使用它。