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

标签 java garbage-collection apache-poi

使用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/

相关文章:

java - 提交页面重定向...Netbeans

java - 分配速度是否取决于所使用的垃圾收集器?

javascript - Concat 字符串的 Node 内存使用情况

javascript - 关闭和垃圾收集 : most efficient way to remove consecutive nodes from a linked list

java - Apache POI 锁定标题行

java - Elasticsearch 使用 RestHighLevelClient 设置限制和偏移量

java - 使用 GSON 解析 JSON 文件

java - 使用 Apache POI docx 的 MS Word 文档中的间距和边距设置

java - 如何在 Java 中修复 "Missing return statement"

java - 在 Java 中设置 pptx 主题