以下是当时的处理流程:
-
top CPU100%
-
arthas attach failure
-
jps -l
-
jmap -histo:live | 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更节省内存,效率也更。缺点就是上手难度高,需要一定的学习成本。
用户事件模式
采用流式解析,我们不再面对Element的事件编程,而是面向StartRow,EndRow,Cell等事件编程。而提供的数据,也不再像之前是原始数据,而是全部格式化好,方便开发者开箱即用。大大简化了我们的开发效率。‘
参考:
https://poi.apache.org/components/spreadsheet/how-to.html
https://poi.apache.org/components/index.html
标签:execl,记录,OOM,导出,Cell,内存,poi,多万条,解析 From: https://www.cnblogs.com/road2master/p/16862678.html