2017-11-30 2 views
1

Ich versuche über 100 MB Video MP4-Datei mit dem unten genannten Code herunterladen. Aber ich bekomme "java.lang.OutOfMemoryError: Java Heap Space" beim Herunterladen.java.lang.OutOfMemoryError: Java-Heap-Speicherplatz beim Download riesige Datei

Verwenden von jdk1.7 & Feder MVC.

Ich habe unter SO Links verwiesen, aber keine funktioniert für mich.

how to download large files without memory issues in java

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

mir bitte helfen dieses Problem zu beheben.

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

Was ist Ihr -Xmx Wert? – Stefan

+0

@Stefan .. Ich laufe auf Eclipse. aus der Eclipse-Konfigurationsdatei - -Xms40m -Xmx1024m. – DEADEND

+0

Welche Version von Java verwenden Sie? Wenn Sie Java 8+ verwenden, versuchen Sie, MetaSpace zu optimieren. – Jyotirup

Antwort

0

Sie müssen HttpServletResponse.flushBuffer() nennen, nicht nur OutputStream.flush(), und ziemlich häufig mehr.

+0

outStream.flush(); Antwort.flushBuffer(); Ich habe diese Zeile hinzugefügt. Aber immer noch passiert Fehler – DEADEND

1

Ich habe versucht, unter Code mit 500 MB-Datei und aus Speicherfehler nicht

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(); 

und JVM-Einstellungen sind erhalten:

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

Amit .. Sie können Videodateien hochladen .. Diese Dateien speichern Java-Speicher? – DEADEND

+0

Aber ich denke, dass Ihre qs zum Download verwandt war, also schrieb ich Code per Download. Wenn der Upload durchgeführt werden muss, müssen Sie sich eine andere Lösung ausdenken, und wo ich sie hochladen muss, können wir sie auch in Chunk hochladen? –

+0

Amit. Client lädt ein Video im Browser vom Server herunter. Ich denke, dass mein RAM-Speicher niedrig ist, weshalb dieses Problem auftritt. – DEADEND

Verwandte Themen