首页 > 其他 > 详细

excel导出导致的频繁young gc的case

时间:2015-12-01 02:04:20      阅读:259      评论:0      收藏:0      [点我收藏+]

? ? ? 一、业务背景

? ? ?

? ? ?这是之前的一个case,需求是这样的:在excel导出的时候,实现列的自适应宽度。(使用的excel处理包是poi-3.9.jar)

?

? ? ?二、实现版本一(有young gc 问题)

? ? ?

? ? ?通过List往sheet里面设置值的时候,每设置一个单元格的值就设置一下自适应宽度,代码如下:


bubuko.com,布布扣
?

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


bubuko.com,布布扣
? ? ?

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

?


bubuko.com,布布扣
? ? ? ?

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

? ? ?
bubuko.com,布布扣
?

? ??三、实现版本二

?

? ? 首先去掉90行的代码,接着,填充完数据后,取表头第一行,然后给第一行设置自适应宽度就ok了

? ??

   fillExcelContent(sheet, lt, startNum);
    //设置自适应宽度
   Row r = sheet.getRow(0);
    for (int i = 0; i < r.getPhysicalNumberOfCells(); i++) {
      	sheet.autoSizeColumn(i);
   }

?

? ?

? ? 总结:这个case是之前很早发生的,在里面主要记录一下这个处理过程

? ?

? ??

? ?

excel导出导致的频繁young gc的case

原文:http://zhuanjiao520.iteye.com/blog/2260624

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!