当我将大型(>300 am )文件上传到servlet时,利用CommonsCommons1.2.1获取OutOfMemoryErrors。这似乎很奇怪,因为使用DiskFileItem的全部目的是防止(可能较大的)文件驻留在内存中。我使用的是10 be的默认大小阈值,所以这就是应该加载到堆中的全部内容,对吗?下面是部分堆栈跟踪:
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)为什么会发生这种情况?我是不是遗漏了什么配置?除了增加堆大小()之外,还有其他避免这种情况的技巧/技巧吗?
我真的不应该增加我的堆,因为从理论上讲,从这个操作中应该加载到内存中的内存最多超过10 is。另外,我的堆最大值(-Xmx)已经设置为1GB,应该足够了。
发布于 2009-11-07 17:47:27
在处理文件上传时,特别是大文件上传时,您应该将这些文件作为流处理,然后将这些文件作为流处理到一个中等大小的内存缓冲区中,并直接复制到输出文件中。做这件事的错误方法是在写出来之前把整个东西吸入记忆中。
公文上传的文档提到了如何“处理文件上传”,就在中间。如果您记得以合理大小的块(例如1MB)从输入流复制到输出流,那么您应该没有问题。
发布于 2012-04-18 16:18:01
虽然卡尔·斯莫特里兹的回答在一般情况下可能更好,但你得到的例外是这里报告的JVM错误:
id=6478546
https://stackoverflow.com/questions/1693810
复制相似问题