大家好,我是烤鸭:
    记一次 由excel导出 导致的cpu飙升200%,jvm 内存不足。

1.  场景复现

前端页面导出Excel,之前导出4,5W条数据都没什么问题的。
    今天业务突然反馈说导出不了了,我试着导出了2w数据,发现页面卡住了,
    没有响应了,查日志,报错如下。

java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committedat org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:488)at javax.servlet.http.HttpServletResponseWrapper.sendRedirect(HttpServletResponseWrapper.java:138)

查看了导出方法,发现如果repsonse在响应过程中抛出异常的话,就会有类似的问题。


     正常的话,因为需要把错误信息带到页面,catch之后再return到对应的页面。
     但如果是上图所示的write方法,如果这地方报异常,就会出现
     Cannot call sendRedirect() after the response has been committed 的异常。

输出文件的代码如下,如果这时候异常。

/*** 输出到客户端* @param fileName 输出文件名*/public ExportExcel write(HttpServletResponse response, String fileName) throws IOException{response.reset();response.setContentType("application/octet-stream; charset=utf-8");response.setHeader("Content-Disposition", "attachment;fileName=" + new String(fileName.getBytes("GBK"), "iso-8859-1")); //中文文件名处理write(response.getOutputStream());return this;}

知道这是写法的问题,但是并没有什么好的办法解决。
    因为 异常需要通过addMessage(redirectAttributes, e.getMessage()) 带到重定向的页面。

但是转念一想,这个问题不应该在这地方出现,因为之前用了很长时间是没有这个问题的。

2.    寻找问题

再次执行导出的时候,监测了一下cpu,为啥,第六感吧。

top    #查看cpu进程运行
ps -ef|grep tomcat_xxx    #查看tomcat 的 pid

pid 是 19021

发现 19021 的进程爆表了...如下图

jstat -gcutil 19021 5000    #每隔5秒打印一次gc  

又去看了gc的情况,每隔5秒打印一次gc,各个空间全都满了。而且YGC和FGC的频次和时间在迅速增加。(下图中的时间还没到满的时候,后来确实都100了)

还好,服务器还撑得住,应该是数据量不是特别大,没有报java.lang.OutOfMemoryError。

jmap -heap 19021    #查看堆内存详细信息
jstack 19021    #查看线程问题(是否死锁)

其实我的问题在这就解决了,想了想最近改动过的代码,基本就锁定了问题,导出时候的问题,
  后来查了excel工具类的代码提交,发现在创建cell单元格的时候,没有判断样式是否存在,
  只要是空单元格,就新创建一个单元格样式。
  改之前:

CellStyle style = wb.createCellStyle();
cell.setCellStyle(style);

改之后:

    if (val != null){CellStyle style = styles.get("data_column_"+column);if (style == null){style = wb.createCellStyle();style.cloneStyleFrom(styles.get("data"+(align>=1&&align<=3?align:"")));style.setDataFormat(wb.createDataFormat().getFormat(cellFormatString));styles.put("data_column_" + column, style);}cell.setCellStyle(style);}

不要小瞧了这个判空,原来的写法会多创建2w行*20列=40w个对象,导致各个空间的满了原因。
    如果还没找到问题的话,就输出gc日志,慢慢查。

jmap -histo 9021>xxx.log    #输出gc日志到文件

3.    总结

如果是gc或者内存问题。

获取当前进程pid

    ps -ef|grep tomcat_xxx 或者 ps -ef|grep java 或者 jps
    查看cpu利用率 
    top
    监测gc
    jstat -gcutil pid 5000
    查看堆内存详细信息
    jmap -heap pid
    查看是否死锁情况
    jstack pid
    还找不到的话,输出gc的日志慢慢找
    jmap -histo pid>xxx.logs

由excel导出引起的cpu 100% 和gc 的问题相关推荐

  1. easyexcel导出excel,大数据量100万以内分页查询zip格式导出

    easyexcel导出excel,大数据量100万以内分页查询zip格式导出 准备工作 整体思路 controller层 service层 mapper层 VO 表结构 测试 备注 easyExcel ...

  2. 记一次悲惨的 Excel 导出事件

    背景 话说这个背景挺惨的,京东某系统使用了poi-ooxml-3.5-final做excel导出功能.起初使用该版本的poi的HSSF配合多线程生成excel,没有任何问题,后来改成了XSSF生成后上 ...

  3. 【解耦Excel导出服务】开发日志

    一.开发分析 1.导出excel设计分析 瓶颈:大量数据导出时 mysql查询连接占用时间过长 组装对象生成excel时,容易导致CPU占用过高.JVM临时内存占用过大(可能导致oom,可能导致GC) ...

  4. springboot项目实现excel导出

    项目中经常会有列表查询,然后导出excel的功能,以下是其中一种方法,简单写个Demo ,先看项目结构: pom.xml <properties><spring-boot.versi ...

  5. 从Excel导出宕机到初学Apache POI

    学习来由 因为在定位一个公司的OOM的时候,花了2天时间,定位问题定位出了方向,知道是导出Excel的时候对象占用太大导致的OOM,但是后来计算了一下数据完全没有达到OOM的情况.症结点就是结论是没错 ...

  6. 记一次悲惨的 excel 导出事件!

    点击上方关注 "终端研发部" 设为"星标",和你一起掌握更多数据库知识 作者:kid_2412 来源:blog.csdn.net/kid_2412/articl ...

  7. 接口访问次数_系统运行缓慢,CPU 100%,Full GC次数过多,这一招帮你全搞定

    处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题.当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警.本文主要针对系统运行缓慢这 ...

  8. 系统运行缓慢,CPU 100%,以及Full GC次数过多问题的排查思路

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:http://h5ip.cn/uWWR 处理过线上问题的同学 ...

  9. 【系统缓慢、CPU 100%、频繁Full GC问题】的定位排查思路!

    作者:爱宝贝 https://my.oschina.net/zhangxufeng/blog/3017521 处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次 ...

最新文章

  1. 【全网之最】最短代码清除数组中的假、空值(0、空、null、undefined、false)
  2. 百度Apollo发布海量自动驾驶数据集,还有两项重磅挑战赛
  3. 放假看片时,一定要检查域名是不是 HTTPS ,不然……
  4. 阿里P7面试官告诉你:3-5年以上的Android开发如何深入进阶?Android中高级开发必须掌握哪些?
  5. 苹果状态栏HTML,CSS3实现苹果电脑的DOCK菜单栏_html/css_WEB-ITnose
  6. php生成静态页面并预览
  7. 百度高德位置定位服务器,调用百度、高德地图App,百度地图网页版,App定位
  8. hi3519av100 2.0版本sdk编译提示 cannot find uuid library required for mkfs.ubifs
  9. office控件显示不了_计算机二级office考试重点难点总结,考生必看!
  10. ESP32 + ESP-IDF |GPIO 03 - 定时器轮询按钮的状态,控制LED亮或者灭
  11. React Native 开发豆瓣评分(六)添加字体图标
  12. MySQL 在指定位置新增字段
  13. Shell:shell中的循环语句
  14. 矩阵分析与应用(二)————梯度分析与最优化
  15. Lab3: 自行车码表
  16. 北京大学可视化发展前沿研究生暑期学校Day4
  17. 关于Zoom连不了,明明别人可以连接,却提示会议号不存在
  18. JQuery CDN大全
  19. 人间简史从动物到上帝读后感_从我的博客到上帝的耳朵...
  20. 【论文解读】Cross-domain Correspondence Learning for Exemplar-based Image Translation

热门文章

  1. [jQuery] 针对jQuery的优化方法有哪些?
  2. [css] 你有使用:valid和:invalid来校验表单吗?
  3. [js] 说说防止重复发送ajax请求的方法有哪些?各自有什么优缺点?
  4. “约见”面试官系列之常见面试题之第九十八篇之vue-router有哪几种导航钩子(建议收藏)
  5. 前端学习(2345):context api
  6. 前端学习(2131):作用域插槽的使用
  7. 前端学习(1598):ref转发
  8. spring学习(15):required属性
  9. 第二十一期:老大难的GC原理及调优,这全说清楚了
  10. html:(11):address和code标签