首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在使用Commons的OutOfMemoryErrors上传大型文件时,如何避免使用DiskFileItem?

在使用Commons的OutOfMemoryErrors上传大型文件时,如何避免使用DiskFileItem?
EN

Stack Overflow用户
提问于 2009-11-07 17:38:31
回答 2查看 9.3K关注 0票数 6

当我将大型(>300 am )文件上传到servlet时,利用CommonsCommons1.2.1获取OutOfMemoryErrors。这似乎很奇怪,因为使用DiskFileItem的全部目的是防止(可能较大的)文件驻留在内存中。我使用的是10 be的默认大小阈值,所以这就是应该加载到堆中的全部内容,对吗?下面是部分堆栈跟踪:

代码语言:javascript
运行
复制
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,应该足够了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-11-07 17:47:27

在处理文件上传时,特别是大文件上传时,您应该将这些文件作为流处理,然后将这些文件作为流处理到一个中等大小的内存缓冲区中,并直接复制到输出文件中。做这件事的错误方法是在写出来之前把整个东西吸入记忆中。

公文上传的文档提到了如何“处理文件上传”,就在中间。如果您记得以合理大小的块(例如1MB)从输入流复制到输出流,那么您应该没有问题。

票数 10
EN

Stack Overflow用户

发布于 2012-04-18 16:18:01

虽然卡尔·斯莫特里兹的回答在一般情况下可能更好,但你得到的例外是这里报告的JVM错误:

id=6478546

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1693810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档