
excel 文件,约 50M 。java 堆内存给到 512m,采用流式方式读取,出现 oom,Java heap space 。
话说流式读取不应该很省内存的吗,为啥 50M 的都读不了。
跟踪 poi 代码 发现在
org.apache.commons.compress.archivers.zip.ZipArchiveInputStream#getNextZipEntry 方法 293 行 new ZipLong(lfhBuf, off);获取到的长度, 该长度是从文件头部获取的长度,不太理解这个获取到的长度是由什么决定的。
在方法 org.apache.poi.util.IOUtils#toByteArray(java.io.InputStream, int)中进行读取数据时,堆内存爆了,暂时没找到限制该大小的办法,此大小应该和文件本身的大小有关。
问题发生在 OPCPackage.open(stream) 方法内
1 hefish 2021 年 7 月 31 日 把 java 的内存调大啊。 |
2 git00ll OP 首先 xlsx 文件本身是一个压缩包,即使是 event 模式,poi 也需要将压缩包内的文件全部加载在内存里,真实使用时再根据流式方式边解析边向外输出。 也就是说最低需要 xlsx 解压后的文件大小的内存才可以进行解析。 |