一、业务背景
这是之前的一个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是之前很早发生的,在里面主要记录一下这个处理过程