2012-03-22 51 views
0

我有一个搜索功能,我将实体的所有记录返回到searh按钮上的用户,现在问题是多少记录(现在,它能够搜索50,000记录)。我现在想,当其超过30000,则抛出下载servlet抛出java堆空间异常

编辑下载所有这些记录在CSV。如果记录少,那么它工作正常,但: -

解决方案: - 使用这些代码

  InputStream in = new ByteArrayInputStream(buffer.toString().getBytes("UTF-8")); 
      ServletOutputStream out = response.getOutputStream(); 

      byte[] outputByte = new byte[4096]; 

      while(in.read(outputByte, 0, 4096) != -1) 
       { 
        out.write(outputByte, 0, 4096); 
        } 
     in.close(); 
      out.flush(); 
       out.close();*/ 
+0

[异常在线程“main”java.lang.OutOfMemoryError:Java堆空间]的可能的重复(http://stackoverflow.com/questions/2381849/exception-in-thread-main-java-lang-outofmemoryerror- java-heap-space) – 2012-03-22 06:32:09

+0

当你使用所有的内存时,你会得到那个错误。 – 2012-03-22 06:32:26

回答

2

而是在内存缓冲区写一切巨人,然后在它的内存字符串拷贝制作一个巨大的线,让WriterHttpServletResponse并直接写入CSV到客户端,你创建它。通过这种方式,您可以将数据从网络上清除到客户端,而不必在发送整个内容之前将其两个完整副本保存在RAM中。

当然,交替做堆更大!

+0

@Affe ...任何工作的例子,如何做到这一点? – rcky 2012-03-22 06:41:25

+0

只需更改generateCSV的签名以接受Writer,将其传入,然后它实现Appendable,因此您实际上不应该更改太多来替换缓冲区,除了在最后刷新而不是返回的toString(); – Affe 2012-03-22 06:51:55

+0

@Affe ......让这种RROR java.lang.OutOfMemoryError的:Java堆空间 \t java.util.Arrays.copyOf(来源不明) \t java.lang.StringValue.from(来源不明) \t的Java。 lang.String。 (未知来源) 我做了一个HttpServletResponse的对象,并使用该对象我得到了作家,然后附加了整个事情....然后刷新它 – rcky 2012-03-22 07:34:23

1

您应该考虑通过套接字流式传输记录,而不是试图将它们全部缓冲在内存中。这可能需要您将OutputStream传递给生成csv的代码。

无论是或者运行你的服务器更多的内存,但这真的不是一个好的答案,因为你只是推迟了一天的OOM例外。

+0

@比尔。你可以详细说明它。 – rcky 2012-03-22 09:07:33

+0

就像情绪说的那样,他或她几乎在同一时间发布了。 ;-) – Bill 2012-03-22 14:04:02