一、业务背景
这是之前的一个case,需求是这样的:在excel导出的时候,实现列的自适应宽度。(使用的excel处理包是poi-3.9.jar)
二、实现版本一(有young gc 问题)
通过List往sheet里面设置值的时候,每设置一个单元格的值就设置一下自适应宽度,代码如下:

这样实现,已经满足了需求。但是我习惯在IDE里面打印gc信息,当我run起来之后,young gc一直在刷屏。就增加了90行一行代码,结果导出时间从0.5s 到 200 s,响应时间超慢,发现gc log中eden 区回收特别频繁

同时,看了眼线程状态,当时线程一直处于运行状态,然后dump线程找到该线程对应的堆栈,找到出问题的代码,结果就是因为新加的一行。怀疑产生了大对象,但是当时以为是sheet对象,结果跟进去后发现

产生了数组对象,然后使用profier查看内存,结果是int[] 140m的实例,正常情况只有几百int[],所以修改了代码

三、实现版本二
首先去掉90行的代码,接着,填充完数据后,取表头第一行,然后给第一行设置自适应宽度就ok了
fillExcelContent(sheet, lt, startNum);
//设置自适应宽度
Row r = sheet.getRow(0);
for (int i = 0; i < r.getPhysicalNumberOfCells(); i++) {
sheet.autoSizeColumn(i);
}
总结:这个case是之前很早发生的,在里面主要记录一下这个处理过程
本文详细介绍了在使用POI-3.9处理Excel时,通过优化列自适应宽度设置来解决年轻垃圾收集导致的性能瓶颈的过程。通过分析GC日志和线程状态,最终通过在填充数据后一次性设置所有列宽的方法,显著提高了导出效率,避免了不必要的性能损耗。
2259

被折叠的 条评论
为什么被折叠?



