`

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

 
阅读更多

      一、业务背景

     

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

   

    

   

  • 大小: 18.1 KB
  • 大小: 23.7 KB
  • 大小: 39 KB
  • 大小: 33.5 KB
6
5
分享到:
评论
1 楼 carlosfu 2015-11-30  

相关推荐

Global site tag (gtag.js) - Google Analytics