gpt4 book ai didi

java - 线程 "main"java.lang.OutOfMemoryError : GC overhead limit exceeded 中 POI 的异常

转载 作者:行者123 更新时间:2023-11-30 06:03:44 24 4
gpt4 key购买 nike

使用XSSFWorkbook,当尝试生成超过250 万行。

此外,我还添加了 JVM 参数 -Xms1024M-Xmx6144,但没有成功。

while (rs.next()) {
row = spreadsheet.createRow(rowID);
for (int column = 0; column < numberOfColumns; column++) {
value = (String) rs.getString(column + 1);
cell = row.createCell(column);
cell.setCellStyle(style);
spreadsheet.setColumnWidth(column, COLUMN_WIDTH);
formatedValue = Engine.formatInput(colNames.get(column),value);
if (formatedValue instanceof Calendar) {
cell.setCellStyle(dateCellStyle);
cell.setCellValue((Calendar) formatedValue);
} else {
if (formatedValue instanceof Double) {
cell.setCellValue((Double) formatedValue);
} else {
if (formatedValue instanceof Integer) {
cell.setCellValue((Integer) formatedValue);
} else {
if (formatedValue instanceof String) {
cell.setCellValue((String) formatedValue);
} else {
/*
* Unreachable.
*/
cell.setCellValue(value);
}
}
}
}
}
rowID++;
if (this.isMaxSpreadsheetRowsReached(rowID)) {
newSpreadSheet(rsmd, numberOfColumns, styleEntete);
rowID = 1;
}
}

异常发生在for循环内部。

一种解决方法是使用 SXSSFWorkbook,但我仍然想使用 XSSFWorkbook

有解决办法吗?

最佳答案

您已经回答了自己的问题。您的源似乎是流式传输的(rs.next()),而生成的工作簿存储在内存中。电子表格对象中有很多内部对象引用,这显然会导致复杂的垃圾收集器开销。

为了避免这种情况,请使用 XSSFWorkbook (SXSSFWorkbook) 的流版本。

但回到你可能问这个问题/不想流式传输的原因:您可能希望将所有寄存器保留在内存中,以便可以更新 header 信息(打印寄存器总数、平均值等)。我担心这种操作不能无限扩展,您可以通过运行源代码两次来实现这一点(首先累积所有辅助信息,如平均值、最大值或最小值,然后打印内容),或者通过打印所有这些信息都位于辅助页面上,然后您可以使用“=”公式在第一页中引用该信息,因此看起来信息位于页面顶部。

关于java - 线程 "main"java.lang.OutOfMemoryError : GC overhead limit exceeded 中 POI 的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51768967/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com