2016-11-28 2 views
1

PDF wird zum ersten Mal heruntergeladen, wenn es das nächste Mal java.lang.OutOfMemoryError auslöst: Java-Heap-Speicher . Die aktuelle Max-Heap-Größe ist 536 MBjava.lang.OutOfMemoryError: Java-Heap-Speicher - beim Schreiben von PDF in outputstream

httpResp.setHeader("Expires", "0"); 
httpResp.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0"); 
httpResp.setHeader("Pragma", "public"); 
httpResp.setHeader("Content-Disposition", "inline; filename="+"BulkIdCard"+".pdf"); 
httpResp.setContentType("application/pdf"); 
httpResp.getOutputStream().write(byte[]);//pdf in byte array 
httpResp.getOutputStream().flush(); 
httpResp.getOutputStream().close(); 
+0

Wie groß sind diese PDF-Dokumente und gibt es einen Griff zum ersten Dokument, das irgendwo herumsteht? –

+0

Ihr Heap kann möglicherweise das erste Byte [] verarbeiten, das beim ersten Download erstellt wurde, und wenn Sie es erneut herunterladen, erstellt es erneut ein Byte [], das außerhalb Ihrer zugewiesenen Java-Heap-Kapazität liegt. Erstellen Sie jedes Mal ein neues Byte [], wenn Sie eine Download-Anfrage erhalten? – vvtx

+0

@TimBiegeleisen Die PDF-Größe hängt davon ab, ob es eine Seite oder 50 Seiten sein kann. Für einen getesteten Fluss beträgt die PDF-Größe 7 MB und die Anzahl der Seiten ist 14. –

Antwort

0

Mit etwas Glück wird das PDF erzeugt als Byte-Array ein ByteArrayOutputStream verwenden. Das Umschreiben in eine Methode, die mit einer OutputStream parametrisiert ist und die httpResp.getOutputStream() passiert, sollte tun.

Es ist jedoch ein guter Zeitpunkt, das erzeugte PDF auf redundante Daten zu überprüfen. Beim Anhängen werden keine veralteten Daten entfernt, wiederholte Bilder sollten nur einmal gespeichert werden usw. Der Vergleich mit einem PDF-Optimierer oder einem sauberen Schreibvorgang kann Hinweise geben. Weniger Daten, bessere Antwortzeiten, Serverlasten.

0

Da Ihr Heap-Maximum größer als Ihr Testdokument ist, ist es nicht sehr wahrscheinlich, dass die Inhaltsbereitstellung selbst so viel Speicher verbraucht.

Entweder benötigt die umgebende Runtime-Infrastruktur so viel Arbeitsspeicher (z. B. Application Server, ...) oder Sie haben Speicherlecks.

Wenn Sie der Meinung sind, dass die Infrastruktur nicht das Problem ist, versuchen Sie, Ihren Heap-Inhalt -XX:+HeapDumpOnOutOfMemoryError zu analysieren, um den Grund zu finden.

0

Sie können in den folgenden Befehlen bis zur Hälfte Ihrer RAM-Größe angeben. Zum Beispiel, wenn Sie 4 GB RAM haben, dann geben Sie Größe bis zu 2048M in den folgenden Befehlen.Wenn 2048 nicht funktioniert, dann versuchen Sie mit etwas weniger Größe sagen 2000M etc ... und so weiter.Bitte überprüfen Sie dies, wenn Sie in Ihrer IDE verwenden ob es Netbeans oder Eclipse etc ... ist oder erhöhen Sie Ihre RAM-Größe.

Verwandte Themen