我正在尝试编写一个 REST api 来允许用户在 Spring boot 上下载大文件(即 > 2GB)。我遇到了“Java Heap outOfMemoryException”。我尝试对问题进行分类,我发现 HttpServetResponse 对象的类型为:ContentCachingResponseWrapper。此类缓存写入输出流的所有内容,当缓存的数据大小变为 258MB 左右时,我会收到 OutOfMemoryException。为什么是 248 MB,因为 JVM 有 256 MB 堆内存。
ContentCachingResponseWrapper 中默认的flushBuffer()方法是空的。如果我尝试调用 copyBodyToResponse()(用于将数据从缓存复制到流),它工作正常,但它也会关闭流。这导致仅将第一块数据发送到客户端。
有什么建议 ?
public void myDownloader(HttpServletRequest request, HttpServletResponse response) {
//response.getClass() is: ContentCachingResponseWrapper
byte[] buffer = new byte[1048576]; // 1 MB Chunks
FileInputStream inputStream = new FileInputStream(PATH_TO_SOME_VALID_FILE);
int bytesRead= 0;
ServletOutputStream outputStream = response.getOutputStream();
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
outputStream.flush();
response.flushBuffer();
}
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Caused by: java.lang.OutOfMemoryError: Java heap space …
Run Code Online (Sandbox Code Playgroud)