现象
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) 方法内