[英]Spring MVC Singleton Controller - Multiple Download Requests
[英]OutOfMemoryError while attending multiple download requests with Spring
尝试下载多个文件时出现OutOfMemoryException。 它们全部正在同时下载,其大小或多或少超过200MB。 我正在使用Spring 3.2.3和Java7。这是来自REST请求的调用。 这是代码:
@RequestMapping(value = "/app/download", method = RequestMethod.GET, produces = MediaType.MULTIPART_FORM_DATA_VALUE)
public void getFile(@PathVariable String param, HttpServletResponse response) {
byte[] fileBytes = null;
String fileLength = null;
try {
// Firstly looking for the file from disk
Path fileFromDisk = getFileFromDisk(param);
InputStream is = null;
long fileLengthL = Files.size(fileFromDisk);
fileLength = String.valueOf(fileLengthL);
// Preparing data for response
String fileName = "Some file name.zip";
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
response.setHeader("Content-Length", fileLength);
is = Files.newInputStream(fileFromDisk);
IOUtils.copy(is, response.getOutputStream());
response.flushBuffer();
} catch (Exception e) {
// Exception treatment
}
}
IOUtils是Apache的库,用于处理文件。 该代码可以完美运行,直到我们一次有多个请求。 我认为问题在于响应中充满了文件中的所有数据,并且直到下载完成才从JVM中释放出来。 我想知道是否有一种方法可以对响应进行分块或类似操作,以避免一次用所有数据填充堆空间。
有任何想法吗?
提前非常感谢您。
您是否给开发环境足够的内存?
我使用Eclipse,其默认内存分配为512m,这在使用Spring时导致了我的问题。
如果您使用的是eclipse,请进入eclipses主文件夹并打开一个名为eclipse.ini的文件。
那里会有一行显示-Xmx512m。
将其更改为您想要分配给开发环境的内存,通常我至少会至少达到-Xmx1024m。
我希望这有帮助。
使用“产生”属性设置的内容类型看起来不正确。 使用setContentType方法直接在响应对象上设置适当的内容类型。 也可以尝试使用setContentLength方法设置内容长度。
经过阅读和阅读,我得出了以下结论:响应对象的输出流必须完全填充,不能将很少的数据块返回给浏览器或客户端。 因此,无论文件大小如何,文件都会被加载。
我个人的解决方案是让第三方来努力。 我的要求需要同时下载多个大文件:由于内存不足,我正在使用一个外部实体,该实体向我提供这些文件作为临时URL。
我不知道这是否是最好的方法,但正在为我工作。
无论如何,谢谢您的答复。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.