![](/img/trans.png)
[英]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.