Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.lang.OutOfMemoryError:下载大型文件时的java堆空间_Java_Spring Mvc_Io_Heap Memory - Fatal编程技术网

java.lang.OutOfMemoryError:下载大型文件时的java堆空间

java.lang.OutOfMemoryError:下载大型文件时的java堆空间,java,spring-mvc,io,heap-memory,Java,Spring Mvc,Io,Heap Memory,我试图下载超过100mb的视频mp4文件,使用下面的代码。但我在下载时得到了“java.lang.OutOfMemoryError:java堆空间” 使用jdk1.7和springmvc 我已经参考了下面的链接,但没有一个适合我 请帮我解决这个问题 OutputStream outStream = null; FileInputStream inputStream = null; try { ServletContext context = request.getSession()

我试图下载超过100mb的视频mp4文件,使用下面的代码。但我在下载时得到了“java.lang.OutOfMemoryError:java堆空间”

使用jdk1.7和springmvc

我已经参考了下面的链接,但没有一个适合我

请帮我解决这个问题

OutputStream outStream = null;
FileInputStream inputStream = null;
try {
    ServletContext context =  request.getSession().getServletContext();     
    String fileName = Integer.toString(fileId);     
    filePath = fileName+".mp4";

    File downloadFile = new File(filePath);
    inputStream = new FileInputStream(new File(filePath));
    // get MIME type of the file
    String mimeType = context.getMimeType(filePath);
    if (mimeType == null) {
        mimeType = "application/octet-stream";
    }
    response.setContentType(mimeType);
    response.setContentLength((int) downloadFile.length());
    String headerKey = "Content-Disposition";
    String headerValue = String.format("attachment; filename=\"%s\"",downloadFile.getName());
    response.setHeader(headerKey, headerValue);
    outStream = response.getOutputStream();
    byte[] buffer = new byte[1024];
    int bytesRead = 0, bytesBuffered = 0;
    while((bytesRead = inputStream.read(buffer)) > -1) {
        outStream.write(buffer, 0, bytesRead);
        bytesBuffered += bytesRead;
        if (bytesBuffered > 1024 * 1024) { //flush after 1MB
            bytesBuffered = 0;
            outStream.flush();
        }
    }
} catch(Exception e) {
    e.printStackTrace();
} finally {
    if (inputStream != null) {
        inputStream.close();
    }
    if (outStream != null) {
        outStream.flush();
        outStream.close();
    }
}

您需要调用
HttpServletResponse.flushBuffer()
,而不仅仅是
OutputStream.flush()
,而且更频繁地调用。

我在下面的代码中使用了500 MB的文件,没有收到内存不足错误

OutputStream outStream = response.getOutputStream();

String mimeType = "application/zip";
String headerKey = "Content-Disposition";
String headerValue = String.format("attachment; filename=\"%s\"",
            "abc.zip");
response.setHeader(headerKey, headerValue);
response.setContentType(mimeType);
response.setStatus(HttpServletResponse.SC_OK);

File downloadFile = new File("file path");
InputStream inputStream = new FileInputStream(downloadFile);

int n = 0;
byte[] buf = new byte[1024];

while ((n = inputStream.read(buf)) != -1) {
        outStream.write(buf, 0, n);
}

inputStream.close();
outStream.flush();
outStream.close();
和JVM设置是:

-XX:PermSize=256m
-XX:MaxPermSize=512m
-Xms1024m
-Xmx2048m
-Dosgi.requiredJavaVersion=1.8
-XX:+UseG1GC
-XX:+UseStringDeduplication

你的-Xmx值是多少?@Stefan。。我正在运行eclipse。从eclipse配置文件--Xms40m-Xmx1024m。您正在使用哪个版本的Java?如果您使用的是Java 8+,请尝试微调MetaSpace。使用Java 1.7..是否可以包含堆栈跟踪?每次都是一样的,还是不同的?outStream.flush();response.flushBuffer();我添加了这一行。但还是发生了错误。。你可以上传视频文件。。这些文件将存储java内存?但我认为您的qs与下载相关,所以我每次下载都编写代码。如果需要上传,那么需要考虑不同的解决方案,我需要上传到哪里,我们也可以上传到chunk?Amit。客户端正在从服务器下载浏览器中的视频。我认为我的ram内存不足,这就是为什么会发生这个问题。