2016-11-28 28 views
1

初めてPDFをダウンロードするときに、次回からjava.lang.OutOfMemoryError:Javaヒープスペース がスローされます。現在の最大ヒープサイズは536メガバイトPDFをByteArrayOutputStreamを使用してバイト配列として生成された運のビットでjava.lang.OutOfMemoryError:Javaヒープスペース - PDFを出力ストリームに書き込むとき

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

これらのPDF文書はどれぐらいの大きさで、どこかに貼り付けられた最初の文書のハンドルですか? –

+0

最初のダウンロードが行われたときに作成された最初のバイト[]をヒープが処理できる可能性があります。また、再度ダウンロードすると、割り当てられたJavaヒープ容量を超えた別のバイト[]が作成されます。ダウンロード要求を受け取るたびに新しいバイト[]を作成していますか? – vvtx

+0

@TimBiegeleisen PDFサイズは1ページにすることも、50ページにすることもできます。テストされた1つのフローでは、PDFサイズは7 MB、ページ数は14です。 –

答えて

0

です。 OutputStreamでパラメータ化されたメソッドに書き換え、httpResp.getOutputStream()を渡す必要があります。

ただし、生成されたPDFで冗長なデータを確認するのは良い瞬間です。追加するとデータが削除されることはありません。繰り返されるイメージは1回だけ保存されます。 PDFオプティマイザやクリーンな書き込みとの比較は、ポインタを与えるかもしれません。少ないデータ、優れた応答時間、サーバー負荷。

0

ヒープの最大値がテストドキュメントよりも大きいため、コンテンツ配信自体がそれほど多くのメモリを消費する可能性は低いです。

周囲の実行時インフラストラクチャでそのようなメモリ(アプリケーションサーバーなど)が消費されたり、そこにメモリリークが発生したりします。

インフラストラクチャに問題がないと思われる場合は、ヒープコンテンツ-XX:+HeapDumpOnOutOfMemoryErrorを分析して原因を調べてください。

0

次のコマンドで、RAMサイズの半分まで指定できます。 たとえば、4GBのRAMがある場合は、次のコマンドで最大2048Mのサイズを指定します。2048が動作しない場合は、2000Mなどのようにサイズを少し小さくして試してみてください。IDEで使用する場合は、それがNetbeansかEclipseかどうか、あなたのRAMサイズを増やしてください。

java -Xms<size>  set initial Java heap size 

(OR) 

java -Xmx<size>  set maximum Java heap size 
関連する問題