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、能尽量用基本类型的不使用引用类型异步操作如图示

具体代码如下:

设置线程池,核心线程数不是越大越好,具体文章请参考

https://blog.csdn.net/wang123459/article/details/82079250

线程池资料参考

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor.html

代码逻辑具体实现:

优化完之后,遗憾的是只能在线上坚挺了不到2天,某一个实例又爆出OOM了,由于添加了jvm监控,异常监控截图如下:

经过分析是由于Eden space 无法为新生对象开辟新的空间,发生了OOM,java堆内存划分如下:

从以下几点分析:(1)内存中加载的数据量过于庞大,如一次从数据库取出过多数据;

(2)集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;

(3)代码中存在死循环或循环产生过多重复的对象实体;

(4)使用的第三方软件中的BUG;

(5)启动参数内存值设定的过小;

受到启发:1、 代码中尽量少使用引用类型2、增大java堆内存3、设置合理的垃圾回收器

验证结果:

1、模拟大批量数据导出:并发请求10-20次,每个请求的数据导出下载量是30w条左右,结果如下:

30w条数据异步导出执行大概需要2-3秒就可以完成,

JVM堆运行情况如下:

其实在极限的条件下,选用合适的方法,而不是现在的服务器配置都很高,而不注重性能相关的问题,程序员的经验不能以工作年限而一味的判定,而是凭处理问题的思路和应变能力,

个人理解牛逼的高手都是在发现问题,解决问题的过程中历练出来的,而不是无谓的代码堆积,那就真正把自己变成的搬砖的了

java导出excel数据量大_解决大批量Excel导出OOM问题相关推荐

  1. Winform中导出Excel数据量百万级的处理办法-导出为csv文件

    场景 Winform中通过NPOI导出Excel的三种方式(HSSFWorkbook,XSSFWorkbook,SXSSFWorkbook)附代码下载: https://blog.csdn.net/B ...

  2. java dubbo服务导出excel数据量过大解决方案

    场景 公司项目有个以前的程序猿写的订单导出excel功能,后台管理界面先查询要导出的数据,然后点击导出按钮进行导出,原来的实现就是界面吧查询条件传到admim模块,admin通过dubbo远程调用or ...

  3. Java操作百万数据量Excel导入导出工具类(程序代码教程)

    Java操作百万数据量Excel导入导出工具类(程序代码教程): # 功能实现1.自定义导入数据格式,支持配置时间.小数点类型(支持单/多sheet)(2种方式:本地文件路径导入(只支持xls.xls ...

  4. Java List数据量大, 需要分片批次操作

    很久前,写过关于list数据量大,分批处理的相关介绍文章(自定义的java代码实现): SSM Mybatis 批量插入 采用分批处理一次500条_默默不代表沉默-CSDN博客_mybatis分批插入 ...

  5. 历史数据如何处理_数据库表数据量大读写缓慢如何优化(1)【冷热分离】

    今天讨论的内容是冷热分离,也许概念并不陌生,对其使用场景也比较熟悉,但涉及锁的内容时仍然需要认真思考,这部分内容在我们实际开发中的"坑"还是不少的. 业务场景一 曾经经历过供应链相 ...

  6. 解决Mysql数据量大的时候 分页优化(使用limit)的问题

    解决Mysql数据量大的时候 分页优化(使用limit)的问题 参考文章: (1)解决Mysql数据量大的时候 分页优化(使用limit)的问题 (2)https://www.cnblogs.com/ ...

  7. Matlab曲线图导出eps数据量太大占用很多存储空间

    Matlab曲线图导出eps数据量太大占用很多存储空间 我的Figure是从simulink里的scope里导出的,因为是采样率很高的时域波形,所以数据量很大.从Figure里导出eps向量格式的话, ...

  8. 航测大数据量处理_一种基于动态航测的图像大数据分析方法与流程

    本发明涉及数据处理技术领域,具体为一种基于动态航测的图像大数据分析方法. 背景技术: 数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详细研究和概括总结的 ...

  9. 航测大数据量处理_【应用案例】徕卡HxMap软件并行处理环境 在大数据量、高效率处理要求下的应用...

    原标题:[应用案例]徕卡HxMap软件并行处理环境 在大数据量.高效率处理要求下的应用 1. HxMap软件简介 HxMap是徕卡航空传感器通用数据处理平台,可提供徕卡测量多款航摄仪的数据后处理以及三 ...

最新文章

  1. Java内存模型终于能讲明白啦,建议收藏!
  2. go gdb调试 参数设置 减小执行文件体积
  3. 前端学习(48):文本缩进和文本对齐
  4. 洞察SaaS:中国SaaS的前世今生
  5. IDEA06 代码规范检测插件之Alibaba Java Coding Guidelines
  6. css3---( 框架)
  7. 洛谷P4720 【模板】扩展卢卡斯
  8. 基于windows server 2008 web服务器的性能,Windows Server 2008之应用程序服务器解析
  9. sqlserver leftjoin出现重复数据_数据库存数据时,逻辑上防重了为啥还会出现重复记录?...
  10. JS的浅拷贝和深拷贝
  11. (C语言)用C语言编写小游戏——三子棋
  12. VS2015社区版MFC安装
  13. linux下cat导出日志,Linux命令:cat
  14. 51单片机 (九)定时器
  15. Scrapy 爬取百度贴吧指定帖子的发帖人和回帖人
  16. 范特西公司面试2012/10/23
  17. 光盘加密刻录时流程及注意事项整理
  18. cvss评分及漏洞矢量
  19. php连接数据库需要的数据库内的登陆名/密码,用PHP连接数据库时,需要提供数据库服务器的IP、数据库用户名、密码和连接的DB名。...
  20. 如何使用anaconda创建环境

热门文章

  1. 华硕笔记本自带win10改win7的方法
  2. vue教程2-03 vue计算属性的使用 computed
  3. [转载]tomcat的配置文件server.xml不支持中文注释的解决办法
  4. PHP 获取当前类名、方法名、URL地址
  5. 贪心,POJ(2709)
  6. OSPFv2的综合实验试题分析第1例(CCNP阶段)
  7. Revit二次开发之“使用ElementTransformUtils.MoveElement()移动元素”
  8. HTML 5 令人期待的 5 项功能
  9. SQL基础:常用SQL语句详解(转)
  10. 用NiceTool在微信浏览器中下载APP