2016-11-28 27 views
1

首次下载PDF时,下次抛出java.lang.OutOfMemoryError:Java堆空间 。当前最大堆大小为536 MBjava.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页。对于一个测试流程,PDF大小为7 MB,页数为14. –

回答

0

随着PDF被作为使用ByteArrayOutputStream字节阵列产生一点点运气。重写为使用OutputStream进行参数化的方法,并通过httpResp.getOutputStream()应该这样做。

然而,检查产生的PDF是否是冗余数据是一个好时机。追加不会删除过时的数据,重复的图像应该只保存一次,等等。与PDF优化器或干净写入相比,可能会提供指针。更少的数据,更好的响应时间,服务器负载。

0

由于堆的最大值比测试文档大几倍,所以内容传送本身不太可能消耗那么多内存。

周围的运行时基础架构会消耗那么多的内存(例如Application Server,...),或者您有一些内存泄漏。

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

0

您可以在以下命令中指定最多一半的RAM大小。 例如,如果你有4GB RAM,那么在下面的命令中指定最大为2048M的大小。如果2048不起作用,那么尝试使用比2000M小一些的大小等等。请在你的IDE中使用时检查这个无论是Netbeans还是Eclipse等等,或者增加你的内存大小。

java -Xms<size>  set initial Java heap size 

(OR) 

java -Xmx<size>  set maximum Java heap size 
相关问题