java导出excel数据量大_解决大批量Excel导出OOM问题
1、背景介绍:最近一直被OOM问题缠绕,原因是表单下载功能访问量比较大,数据量相当多,表单数据存储在mongodb,数据总量2亿多,每个实例总内存限制1.5G左右,线上部署了5个实例,但是最大承受时间也不过3天,于是决定逐步优化解决此问题
2、环境介绍:
2.1、vm: openjdk:8-jre-alpine
2.2、docker 部署,k8s管理
3、问题呈现:
3.1、导出大批量Excel时,nginx 504
3.2、访问量高 && 导出大批量Excel,出现OOM
4、问题分析:
4.1、nginx 504 问题,服务器长时间无响应,根本原因是同步操作,mongodb查询慢
4.2、数据保存在mongodb,mongodb分页是深分页,会全表扫描
5、解决办法:
5.1、导出采用异步操作,多线程异步处理
5.2、大批量的Excel采用下载到磁盘,统一压缩为zip文件上传到腾讯云,
5.3、能尽量用基本类型的不使用引用类型异步操作如图示
![](/assets/blank.gif)
具体代码如下:
设置线程池,核心线程数不是越大越好,具体文章请参考
https://blog.csdn.net/wang123459/article/details/82079250
线程池资料参考
https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor.html
![](/assets/blank.gif)
代码逻辑具体实现:
![](/assets/blank.gif)
![](/assets/blank.gif)
优化完之后,遗憾的是只能在线上坚挺了不到2天,某一个实例又爆出OOM了,由于添加了jvm监控,异常监控截图如下:
![](/assets/blank.gif)
![](/assets/blank.gif)
经过分析是由于Eden space 无法为新生对象开辟新的空间,发生了OOM,java堆内存划分如下:
![](/assets/blank.gif)
从以下几点分析:(1)内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
(2)集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
(3)代码中存在死循环或循环产生过多重复的对象实体;
(4)使用的第三方软件中的BUG;
(5)启动参数内存值设定的过小;
受到启发:1、 代码中尽量少使用引用类型2、增大java堆内存3、设置合理的垃圾回收器
验证结果:
1、模拟大批量数据导出:并发请求10-20次,每个请求的数据导出下载量是30w条左右,结果如下:
![](/assets/blank.gif)
![](/assets/blank.gif)
30w条数据异步导出执行大概需要2-3秒就可以完成,
JVM堆运行情况如下:
![](/assets/blank.gif)
其实在极限的条件下,选用合适的方法,而不是现在的服务器配置都很高,而不注重性能相关的问题,程序员的经验不能以工作年限而一味的判定,而是凭处理问题的思路和应变能力,
个人理解牛逼的高手都是在发现问题,解决问题的过程中历练出来的,而不是无谓的代码堆积,那就真正把自己变成的搬砖的了
java导出excel数据量大_解决大批量Excel导出OOM问题相关推荐
- Winform中导出Excel数据量百万级的处理办法-导出为csv文件
场景 Winform中通过NPOI导出Excel的三种方式(HSSFWorkbook,XSSFWorkbook,SXSSFWorkbook)附代码下载: https://blog.csdn.net/B ...
- java dubbo服务导出excel数据量过大解决方案
场景 公司项目有个以前的程序猿写的订单导出excel功能,后台管理界面先查询要导出的数据,然后点击导出按钮进行导出,原来的实现就是界面吧查询条件传到admim模块,admin通过dubbo远程调用or ...
- Java操作百万数据量Excel导入导出工具类(程序代码教程)
Java操作百万数据量Excel导入导出工具类(程序代码教程): # 功能实现1.自定义导入数据格式,支持配置时间.小数点类型(支持单/多sheet)(2种方式:本地文件路径导入(只支持xls.xls ...
- Java List数据量大, 需要分片批次操作
很久前,写过关于list数据量大,分批处理的相关介绍文章(自定义的java代码实现): SSM Mybatis 批量插入 采用分批处理一次500条_默默不代表沉默-CSDN博客_mybatis分批插入 ...
- 历史数据如何处理_数据库表数据量大读写缓慢如何优化(1)【冷热分离】
今天讨论的内容是冷热分离,也许概念并不陌生,对其使用场景也比较熟悉,但涉及锁的内容时仍然需要认真思考,这部分内容在我们实际开发中的"坑"还是不少的. 业务场景一 曾经经历过供应链相 ...
- 解决Mysql数据量大的时候 分页优化(使用limit)的问题
解决Mysql数据量大的时候 分页优化(使用limit)的问题 参考文章: (1)解决Mysql数据量大的时候 分页优化(使用limit)的问题 (2)https://www.cnblogs.com/ ...
- Matlab曲线图导出eps数据量太大占用很多存储空间
Matlab曲线图导出eps数据量太大占用很多存储空间 我的Figure是从simulink里的scope里导出的,因为是采样率很高的时域波形,所以数据量很大.从Figure里导出eps向量格式的话, ...
- 航测大数据量处理_一种基于动态航测的图像大数据分析方法与流程
本发明涉及数据处理技术领域,具体为一种基于动态航测的图像大数据分析方法. 背景技术: 数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详细研究和概括总结的 ...
- 航测大数据量处理_【应用案例】徕卡HxMap软件并行处理环境 在大数据量、高效率处理要求下的应用...
原标题:[应用案例]徕卡HxMap软件并行处理环境 在大数据量.高效率处理要求下的应用 1. HxMap软件简介 HxMap是徕卡航空传感器通用数据处理平台,可提供徕卡测量多款航摄仪的数据后处理以及三 ...
最新文章
- Java内存模型终于能讲明白啦,建议收藏!
- go gdb调试 参数设置 减小执行文件体积
- 前端学习(48):文本缩进和文本对齐
- 洞察SaaS:中国SaaS的前世今生
- IDEA06 代码规范检测插件之Alibaba Java Coding Guidelines
- css3---( 框架)
- 洛谷P4720 【模板】扩展卢卡斯
- 基于windows server 2008 web服务器的性能,Windows Server 2008之应用程序服务器解析
- sqlserver leftjoin出现重复数据_数据库存数据时,逻辑上防重了为啥还会出现重复记录?...
- JS的浅拷贝和深拷贝
- (C语言)用C语言编写小游戏——三子棋
- VS2015社区版MFC安装
- linux下cat导出日志,Linux命令:cat
- 51单片机 (九)定时器
- Scrapy 爬取百度贴吧指定帖子的发帖人和回帖人
- 范特西公司面试2012/10/23
- 光盘加密刻录时流程及注意事项整理
- cvss评分及漏洞矢量
- php连接数据库需要的数据库内的登陆名/密码,用PHP连接数据库时,需要提供数据库服务器的IP、数据库用户名、密码和连接的DB名。...
- 如何使用anaconda创建环境
热门文章
- 华硕笔记本自带win10改win7的方法
- vue教程2-03 vue计算属性的使用 computed
- [转载]tomcat的配置文件server.xml不支持中文注释的解决办法
- PHP 获取当前类名、方法名、URL地址
- 贪心,POJ(2709)
- OSPFv2的综合实验试题分析第1例(CCNP阶段)
- Revit二次开发之“使用ElementTransformUtils.MoveElement()移动元素”
- HTML 5 令人期待的 5 项功能
- SQL基础:常用SQL语句详解(转)
- 用NiceTool在微信浏览器中下载APP