alibaba/easyexcel

easyexcle从3.1.1升级到4.0.3,jdk从8升级到jdk21,使用fillData()应用出现OOM

Open

#4.024 geöffnet am 17. Okt. 2024

Auf GitHub ansehen
 (1 Kommentar) (0 Reaktionen) (0 zugewiesene Personen)Java (7.599 Forks)batch import
help wanted

Repository-Metriken

Stars
 (33.728 Stars)
PR-Merge-Metriken
 (Keine gemergten PRs in 30 T)

Beschreibung

异常代码

   try (ExcelWriter excelWriter = EasyExcel
                .write(this.resultFilePath)
                .withTemplate(templateFilePath)
                .excelType(ExcelTypeEnum.XLSX)
                .build()) {
            WriteSheet build = EasyExcel.writerSheet(0).build();
            List<RecruitmentMonthlyRecordsFillData> data = fillData(endDate);
            excelWriter.fill(data, build);
        }

问题描述

代码如上所示 jdk8 -> jdk21 springboot2.7.8 -> springboot3.2.8 easyexcel3.1.1 -> 4.0.3

通过Arthas分析发现,在最后的com/alibaba/excel/ExcelWriter.close方法中,占用了大量内存。 继续向下分析发现 org/apache/poi/xssf/streaming/SXSSFWorkbook.copyStreamAndInjectWorksheet方法是性能损耗最大的地方

依赖版本如下:

内存火焰图如下:

jdk21+springboot3.2.8+easyexcel4.0.3版本中 火焰图如下:

jdk1.8+springboot2.7.8+easyexcel4.0.3版本中 火焰图如下:

相同的版本,相同的代码,jdk和springboot的版本不同,两张火焰图里面的close方法差别很大

Contributor Guide