使用 Commons FileUpload 1.2.1 将大型 (>300MB) 文件上传到 servlet 时,出现 OutOfMemoryErrors。这似乎很奇怪,因为使用 DiskFileItem 的全部目的是防止(可能很大)文件驻留在内存中。我使用的是 10KB 的默认大小阈值,所以这就是应该加载到堆中的所有内容,对吧?这是部分堆栈跟踪:
java.lang.OutOfMemoryError
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(FileInputStream.java:177)
at org.apache.commons.fileupload.disk.DiskFileItem.get(DiskFileItem.java:334)
at org.springframework.web.multipart.commons.CommonsMultipartFile.getBytes(CommonsMultipartFile.java:114)
为什么会这样?我缺少一些配置吗?除了增加我的堆大小之外,还有什么提示/技巧可以避免这种情况?
我真的不应该增加我的堆,因为理论上应该从这个操作加载到内存中的最多是 10KB 多一点。另外,我的堆最大值(-Xmx)已经设置为 1GB,应该足够了。