数据量比较大的情况下直接导出可能会出现内存溢出

简介: 数据量比较大的情况下直接导出可能会出现内存溢出

故障原因
下午14:30左右服务器load明显飙升出现登录缓慢的情况



处理过程
根据告警信息提示,是应用服务器的load指标过高引起,查询ECS服务器的指标发现cpu在14:30左右出现明显飙升


load指标也有明显飙升



排查思路:
联系志成导出出现异常时间点附近的服务器日志,打开导出的jstack文件,发现cpu时间较高的线程


打开导出的dump文件,发现存在线程占用内存过高的情况



继续查看线程的堆栈信息,和jstack中找到的一致,发现是导出文件引起的异常现象



静态文件导出由于模版文件不会很大,所以理论上不大可能会出现这种情况,很大可能是导出动态生成的文件引起,由于数据量过大,导致导出过程内存占用过高
目前导出采用的是POI框架,导出使用的WORKBOOK为XSSFWORKBOOK,计划改成SXSSFWORKBOOK,这种WORKBOOK有提供一个包含rowAccessWindowSize参数的构造函数,这个参数表示内存可见条数,超过部分会存到磁盘上,需要在uat或其他环境做一下验证

暴露的问题
目前有部分文件导出采用的是同步的方式导出,在数据量比较大的情况下直接导出可能会出现内存溢出的情况

改进措施
计划采用SXSSFWORKBOOK设置内存可见条数的方式作为处理方案,在uat环境进行验证

若有收获,就点个赞吧


相关文章
|
5月前
|
SQL 前端开发 关系型数据库
导出任务耗时怎么优化?
当处理大量数据的导入导出时,需避免长时间阻塞用户界面。推荐采用异步任务处理方式,提交任务后后台线程执行数据处理。对于导出功能,设计前端界面包括“导出”与“导出记录”按钮;导出记录包含批次号、时间、导出URL等字段。后端生成Excel文件并上传至服务器,记录URL以便下载。导入功能类似,记录批次号、总条数、成功条数等信息。为避免大量数据查询导致内存溢出或系统响应缓慢,应使用分批处理策略,例如分页查询来减轻MySQL内存负担。提供了Java工具类实现分页查询和处理逻辑
|
5月前
|
SQL 前端开发 关系型数据库
导出任务耗时如何优化
大量数据的导入导出时,请求一定非常耗时,页面一定会不停转圈圈,不可能让用户一直停留在这个页面转圈圈,这样并不友好。 比较好的方式就事通过异步的方式,先提交任务,然后通过线程的处理数据。一次性如果导出大量数据时,需要批量查询结果到处。
|
缓存 Java easyexcel
如何高效的导出 百万级别的数据量 到 Excel?
如何高效的导出 百万级别的数据量 到 Excel?
238 0
|
7月前
|
分布式计算 大数据 Java
maxcompute函数问题之数据量较大经常OOM如何解决
MaxCompute函数包括内置函数和自定义函数(UDF),它们用于在MaxCompute平台上执行数据处理和分析任务;本合集将介绍MaxCompute函数的使用方法、函数编写和优化技巧,以及常见的函数错误和解决途径。
|
7月前
|
SQL Java 数据库连接
Flink内存问题之超出物理内存如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。
|
消息中间件 关系型数据库 Shell
记录贴:sentry磁盘占用过大如何清理?
记录贴:sentry磁盘占用过大如何清理?
1236 0
【PE准备阶段】将内存中的数据读取到内存,将内存中的数据读取到文件中【滴水逆向39期作业】
【PE准备阶段】将内存中的数据读取到内存,将内存中的数据读取到文件中【滴水逆向39期作业】
|
SQL 算法 关系型数据库
100G内存下,MySQL查询200G大表会OOM么?
我的主机内存只有100G,现在要全表扫描一个200G大表,会不会把DB主机的内存用光? 逻辑备份时,可不就是做整库扫描吗?若这样就会把内存吃光,逻辑备份不是早就挂了? 所以大表全表扫描,看起来应该没问题。这是为啥呢?
100G内存下,MySQL查询200G大表会OOM么?
|
关系型数据库 MySQL 索引