数据量比较大的情况下直接导出可能会出现内存溢出
2023-03-14 22:39:31 时间
故障原因
下午14:30左右服务器load明显飙升出现登录缓慢的情况
处理过程
根据告警信息提示,是应用服务器的load指标过高引起,查询ECS服务器的指标发现cpu在14:30左右出现明显飙升
load指标也有明显飙升
排查思路:
联系志成导出出现异常时间点附近的服务器日志,打开导出的jstack文件,发现cpu时间较高的线程
打开导出的dump文件,发现存在线程占用内存过高的情况
继续查看线程的堆栈信息,和jstack中找到的一致,发现是导出文件引起的异常现象
静态文件导出由于模版文件不会很大,所以理论上不大可能会出现这种情况,很大可能是导出动态生成的文件引起,由于数据量过大,导致导出过程内存占用过高
目前导出采用的是POI框架,导出使用的WORKBOOK为XSSFWORKBOOK,计划改成SXSSFWORKBOOK,这种WORKBOOK有提供一个包含rowAccessWindowSize参数的构造函数,这个参数表示内存可见条数,超过部分会存到磁盘上,需要在uat或其他环境做一下验证
暴露的问题
目前有部分文件导出采用的是同步的方式导出,在数据量比较大的情况下直接导出可能会出现内存溢出的情况
改进措施
计划采用SXSSFWORKBOOK设置内存可见条数的方式作为处理方案,在uat环境进行验证
相关文章
- 一篇带你了解Redis删除策略
- CSS 布局的本质是什么
- GaussDB Hash表分布列选择原则及数据倾斜检测
- NumPy 索引和切片的用法总结
- 如何使用Kafka Connect创建用于处理实时数据的开源数据管道?
- 你的业务代码,是不是都写在了Activity里?
- 两大步骤,29行代码学会数据清洗
- 一文搞懂基础数据单位换算逻辑
- HarmonyOS DataBinding 使用指南
- 深度剖析:Redis分布式锁安全吗?
- Redis中一个String类型引发的惨案
- 现实中的应用程序是如何丢失数据?
- 使用 Codable 归档 Swift 对象
- 您如何判断是否用足够的数据训练了模型?
- 如何从 Spark 的 DataFrame 中取出具体某一行?
- Redis持久化基石RDB与AOF
- 高可用的升级-RocketMQ知识体系7
- 架构上如何设计领域模型和数据模型?
- 分形之城:递归超典型例题,还没明白?手把手画给你看!
- 如何结合 Core Data 和 SwiftUI