? ? ? 一、业务背景
? ? ?
? ? ?这是之前的一个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是之前很早发生的,在里面主要记录一下这个处理过程
? ?
? ??
? ?
原文:http://zhuanjiao520.iteye.com/blog/2260624