记录上个月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更节省内存,效率也更。缺点就是上手难度高,需要一定的学习成本。
用户事件模式

浙公网安备 33010602011771号