簡體   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