java.lang.OutOfMemoryError:Java堆空间 - 将pdf写入outputstream

时间:2016-11-28 07:43:04

标签: java outputstream

PDF首次下载,从下次抛出java.lang.OutOfMemoryError:Java堆空间 。当前最大堆大小为536 MB

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

3 个答案:

答案 0 :(得分:0)

运气好的话,PDF使用ByteArrayOutputStream生成为字节数组。重写为使用OutputStream参数化的方法,并且应该传递httpResp.getOutputStream()

然而,检查生成的PDF是否有冗余数据是一个好时机。追加不会删除过时的数据,重复的图像只能存储一次,依此类推。与PDF优化器或干净写入相比可能会给出指示。更少的数据,更好的响应时间,服务器负载。

答案 1 :(得分:0)

因为您的堆最大值比测试文档大很多,所以内容传递本身不太可能消耗那么多内存。

周围的运行时基础架构消耗了大量内存(例如Application Server,......),或者你有一些内存泄漏。

如果您认为基础架构不是问题,请尝试分析堆内容-XX:+HeapDumpOnOutOfMemoryError以找出原因。

答案 2 :(得分: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