alibaba/easyexcel

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

Open

#4.024 aberto em 17 de out. de 2024

Ver no GitHub
 (1 comment) (0 reactions) (0 assignees)Java (7.599 forks)batch import
help wanted

Métricas do repositório

Stars
 (33.728 stars)
Métricas de merge de PR
 (Nenhuma PRs mesclada em 30d)

Description

异常代码

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

Guia do colaborador