gpt4 book ai didi

java - 使用Commons FileUpload的DiskFileItem上传大文件时如何避免OutOfMemoryErrors?

转载 作者:搜寻专家 更新时间:2023-10-31 19:31:35 25 4
gpt4 key购买 nike

将大型 (>300MB) 文件上传到时出现 OutOfMemoryErrors使用 Commons FileUpload 1.2.1 的 servlet。这看起来很奇怪,因为使用 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,应该足够了。

最佳答案

在处理文件上传时,尤其是大文件上传时,您应该将这些文件作为流处理,然后将其放入中等大小的内存缓冲区中,然后直接复制到输出文件中。错误的做法是在写出之前将整个内容吸入内存。

The doc on commons-upload在中间下方提到如何“处理文件上传”。如果您记得以合理大小的 block (比如 1 MB)从输入流复制到输出流,您应该没有问题。

关于java - 使用Commons FileUpload的DiskFileItem上传大文件时如何避免OutOfMemoryErrors?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1693810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com