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

简介: 内存溢出/OOM

故障原因

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


处理过程

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

load指标也有明显飙升


排查思路:

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

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


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


静态文件导出由于模版文件不会很大,所以理论上不大可能会出现这种情况,很大可能是导出动态生成的文件引起,由于数据量过大,导致导出过程内存占用过高

目前导出采用的是POI框架,导出使用的WORKBOOK为XSSFWORKBOOK,计划改成SXSSFWORKBOOK,这种WORKBOOK有提供一个包含rowAccessWindowSize参数的构造函数,这个参数表示内存可见条数,超过部分会存到磁盘上,需要在uat或其他环境做一下验证

暴露的问题

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


改进措施

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

相关文章
|
12天前
|
Java
使用JProfile查看java导出内存快照
使用JProfile查看java导出内存快照
11 0
|
Java Web App开发 存储
解决java poi海量数据导出内存溢出问题
解决java poi海量数据导出导致内存溢出的问题
13216 0
|
存储 NoSQL 架构师
Redis 10亿数据量只需要100MB内存,为什么这么牛?
reids位操作也叫位数组操作、bitmap,它提供了SETBIT、GETBIT、BITCOUNT、BITTOP四个命令用于操作二进制位数组。
【POI】导出excel文件,不生成中间文件,直接将内存中的数据创建对象下载到浏览器
不是从InputStream中read,然后outputStream再write @RequestMapping("download4Excel") public void download4Excel(HttpServletResponse response){ XS...
1640 0
|
PHP 缓存 Memcache
phpExcel导出文件时内存溢出的问题
在使用PHPExcel导出文件时,经常会因为文件过大导致PHP内存溢出报错,为了解决这个问题,可以使用PHPExcel提供的参数进行优化。这里说的Excel文件过大并不一定是文件大小,更关键的在于文件内存放的数据和格式,如果数据很多,格式又比较丰富,那很容易会将PHP的内存耗尽。
1686 0
|
Java Shell
【poi】解决java导出excel 海量数据内存溢出问题
转自百度经验:http://jingyan.baidu.com/article/4853e1e5202c331909f72627.html 那里排版忒恶心,转来这里。   由于项目中有导出海量数据的需求,在谷歌和百度也没有找到好的解决办法,经过仔细研究发现poi-3.8版本以上提供新的模式可以满足这个需求,写在这里希望能对有同样需求的同行们有所帮助。
2329 0
|
13天前
|
存储 Java C++
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据,如局部变量和操作数;本地方法栈支持native方法;堆存放所有线程的对象实例,由垃圾回收管理;方法区(在Java 8后变为元空间)存储类信息和常量;运行时常量池是方法区一部分,保存符号引用和常量;直接内存非JVM规范定义,手动管理,通过Buffer类使用。Java 8后,永久代被元空间取代,G1成为默认GC。
23 2
|
16天前
|
存储
数据在内存中的存储(2)
数据在内存中的存储(2)
25 5