背景:
有个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-----------------------------