繁体   English   中英

Spring参加多个下载请求时出现OutOfMemoryError

[英]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时导致了我的问题。

  1. 如果您使用的是eclipse,请进入eclipses主文件夹并打开一个名为eclipse.ini的文件。

  2. 那里会有一行显示-Xmx512m。

  3. 将其更改为您想要分配给开发环境的内存,通常我至少会至少达到-Xmx1024m。

我希望这有帮助。

使用“产生”属性设置的内容类型看起来不正确。 使用setContentType方法直接在响应对象上设置适当的内容类型。 也可以尝试使用setContentLength方法设置内容长度。

经过阅读和阅读,我得出了以下结论:响应对象的输出流必须完全填充,不能将很少的数据块返回给浏览器或客户端。 因此,无论文件大小如何,文件都会被加载。

我个人的解决方案是让第三方来努力。 我的要求需要同时下载多个大文件:由于内存不足,我正在使用一个外部实体,该实体向我提供这些文件作为临时URL。

我不知道这是否是最好的方法,但正在为我工​​作。

无论如何,谢谢您的答复。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM