记录上个月execl导出40多万条库存记录导致OOM
以下是当时的处理流程:
-
top CPU100%
-
arthas attach failure
-
jps -l
-
jmap -histo:live <pid> | more
-
heapdump
-
MAT(JVisualVM)
-
XSSFWorkbook修改成SXSSFWorkbook
(POI的导出优化类,维护一个窗口大小,内存只会维持窗口大小的行的数据,超过的会把之前行数据刷到磁盘临时文件里,再把临时文件转为正常的xlsx文件格式输出 - 测试之后在JVisualVM观察内存上升和回收都很平稳,OOM问题解决。
excel导入模式
用户模式
耗内存 类似用 WorkbookFactory.create(inputStream),poi 会把整个文件一次性解析,生成全部的Sheet,Row,Cell以及对象,如果导入文件数据量大的话,也很可能会导致OOM。
事件模式
边读取边解析,并且不会将这些数据封装成Row,Cell这样的对象。解析出来的对象是不需要一直驻留在内存中,而是解析完使用后就可以回收。所以相比于User Model,Event Model更节省内存,效率也更。缺点就是上手难度高,需要一定的学习成本。
用户事件模式
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?