最近服务器时不时的会卡死,后来经过日志分析,发如今卡死的时候有进行excel导出的操做,因而kill掉进程重启后本身手动尝试了下,发现导出的数据量超过三万条时cpu的使用率居然高达600%(服务器8核8G,tomcat原始配置的环境),而后这种情况持续个一分钟左右后tomcat就会卡死。前端
问题已经明确了就是导出的问题,后来就上网查各类解决方式,有说大数据量换成csv的,可是为了方便财务的使用,仍是坚持了导出excel,根据咱们如今的业务量,一周也就将近3万条订单数据,导出excel正常来讲应该是彻底没有问题的,因而接着找解决方式。tomcat
首先查找cpu太高的缘由,经过使用jvisualvm监控工具查看cpu的实时动态,发如今堆内存骤然上升后,发生jvm垃圾回收的时候cpu会陡然上升,稍后会稍微降低,一下子又会进行垃圾回收,致使cpu再次飙高。经过分析,基本上问题锁定在堆内存高使用量且频繁GC的缘由致使的,因而开始对导出代码进行优化,导出excel引入的是poi-3.10的jar包,由于涉及到for循环操做,以前头脑中有个印象就是变量的声明最后是放到循环外,但又不是很肯定,就上网查了下,结合http://www.iteye.com/problems/16385和两篇博文,我我的仍是比较承认在循环外进行变量的声明的,由于在循环内声明变量,若是数据量大的话会不断的在stack中分配新的内存,仍是会有必定的影响的,因此第一步优化就是把循环内的变量提出到循环体外进行声明;服务器
第一步的优化相对来讲影响是不那么大的,接下来才是重点,对jvm进行优化,经过设置jvm参数:jvm
JAVA_OPTS="-Xms4096m -Xmx4096m -XX:PermSize=256M -XX:MaxNewSize=1024m"工具
第二步优化完以后重启tomcat再次进行测试,发现cpu最高也就到200%多,平时的cpu都15%之内,测试