CPU350% JVM GC频繁并GC不掉EXCEL导出

背景:

        有个Excel导出的需求,测试的时候,只要连续导出大量的数据就会导致FAT机器反请求反应迟钝,甚至卡死,无法恢复。

排查:

        1 跳板机跳到机器上,查看 项目 ipd  执行ps -ef | grep  项目名称.jar  查看后PID  执行 top -p PID ,查看cpu内存占用,CPU 占用百分之350%左右。

        2 查看内存使用较高,查看gc日志log,tail -f gc.log  发现 一直频繁YGC

        3 下载 JProFiler Java JVM分析利器JProfiler 结合IDEA使用详细教程_jprofiler使用教程-CSDN博客

        4 本地启动项目并测试排查,发现占用JVM不能释放的如图 char 和 string 是因为 ZprojeectBo 实体里的数据

        5 排查代码发现 实体ZProjeectBO 是Excel导出的主要实体,也就是所有excel导出的数据都在里面,并且是做了分页的,按道理不应该占用那摩多内存,但深入排查代码发现

//伪代码
List<ZProjeectBO> zp = new List<>;

for(每一页){
    zp = 查每一页()
    //写入 excel
}
//这里页数多了 或者 zp数据太多  就会导致GC不掉
//因为 循环中 zp 虽然每次 重新赋值 但是在for循环里面不会被回收

解决方案:再循环中 极爱如 zp = null   和 System.gc();

        6 然后 再次测试 已经有很大改善 

但 AttrXobj 和ElemenXob 占用多 并且 老年代直接爆满

经过 百度 https://zhuanlan.zhihu.com/p/367119379 查到原因是因为excel当前使用的导出 ,如果导出数据过多有OOM的问题

解决方案:改成 SXSSFWorkbook 代替 或者其他 能对大量excel导出 数据写入文件而不是内存的,就能解决 内存释放不掉问题。

改完

----------------------------chenchen-----------------------------

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值