alibaba/easyexcel

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

Open

#4024 aperta il 17 ott 2024

Vedi su GitHub
 (1 commento) (0 reazioni) (0 assegnatari)Java (7599 fork)batch import
help wanted

Metriche repository

Star
 (33.728 star)
Metriche merge PR
 (Nessuna PR mergiata in 30 g)

Descrizione

异常代码

   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方法差别很大

Guida contributor