java.lang.OutOfMemoryError:下载大型文件时的java堆空间
我试图下载超过100mb的视频mp4文件,使用下面的代码。但我在下载时得到了“java.lang.OutOfMemoryError:java堆空间” 使用jdk1.7和springmvc 我已经参考了下面的链接,但没有一个适合我 请帮我解决这个问题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()
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内存不足,这就是为什么会发生这个问题。