记录上个月execl导出40多万条库存记录导致OOM

以下是当时的处理流程:
  1. top CPU100%

  2. arthas attach failure

  3. jps -l

  4. jmap -histo:live <pid> | more

  5. heapdump

  6. MAT(JVisualVM)

  7. XSSFWorkbook修改成SXSSFWorkbook(POI的导出优化类,维护一个窗口大小,内存只会维持窗口大小的行的数据,超过的会把之前行数据刷到磁盘临时文件里,再把临时文件转为正常的xlsx文件格式输出

  8. 测试之后在JVisualVM观察内存上升和回收都很平稳,OOM问题解决。

excel导入模式

用户模式

  耗内存 类似用 WorkbookFactory.create(inputStream),poi 会把整个文件一次性解析,生成全部的Sheet,Row,Cell以及对象,如果导入文件数据量大的话,也很可能会导致OOM。

事件模式

  边读取边解析,并且不会将这些数据封装成Row,Cell这样的对象。解析出来的对象是不需要一直驻留在内存中,而是解析完使用后就可以回收。所以相比于User Model,Event Model更节省内存,效率也更。缺点就是上手难度高,需要一定的学习成本。

用户事件模式

  采用流式解析,我们不再面对Element的事件编程,而是面向StartRow,EndRow,Cell等事件编程。而提供的数据,也不再像之前是原始数据,而是全部格式化好,方便开发者开箱即用。大大简化了我们的开发效率。‘

参考:

  https://poi.apache.org/components/spreadsheet/how-to.html

  https://poi.apache.org/components/index.html

posted @   road2master  阅读(229)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示