2017-11-30 4 views
1

私は以下のコードを使用して100MB以上のビデオmp4ファイルをダウンロードしようとしています。しかし、私はダウンロード中に "java.lang.OutOfMemoryError:Java heap space"を取得しています。java.lang.OutOfMemoryError:Java heap space巨大なファイルをダウンロードするとき

jdk1.7の使用& Spring MVC。

私はSOのリンクの下で言及していますが、私のためにはうまくいきません。

java.lang.OutOfMemoryError: Java heap space while downloading a large file from an URL

how to download large files without memory issues in java

これを解決するために私を助けてください。

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(); 
    } 
} 
+0

あなたの-Xmx値は何ですか? – Stefan

+0

@Stefan ..私は日食で走っています。 Eclipseの設定ファイル-Xms40m -Xmx1024mから。 – DEADEND

+0

あなたはJavaを使用していますか? Java 8以降を使用している場合は、MetaSpaceの微調整を試してください。 – Jyotirup

答えて

0

あなただけではなくOutputStream.flush()、むしろより頻繁に、HttpServletResponse.flushBuffer()を呼び出す必要があります。

+0

outStream.flush(); response.flushBuffer();私はこの行を追加しました。しかし、まだエラーが発生する – DEADEND

1

私は500メガバイトのファイルを使用してコードの下にしようとしたメモリエラーのうち、

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 
+0

Amit ..あなたはビデオファイルをアップロードすることができます..これらのファイルは、Javaメモリを格納しますか? – DEADEND

+0

しかし、私はqsがダウンロードに関連していたと思うので、私はダウンロードごとにコードを書いた。アップロードが必要な場合は、別のソリューションを考える必要があります。どこにアップロードする必要があるか、チャンクでアップロードすることもできますか? –

+0

Amit。クライアントがサーバーからブラウザでビデオをダウンロードしています。私は、この問題がなぜ起こるのか、私のラムの記憶は低いと思います。 – DEADEND

関連する問題