下载servlet抛出java堆空间异常

时间:2012-03-22 06:28:08

标签: java

我有一个搜索功能,我将实体的所有记录返回到用户的searh按钮,现在记录了多少(现在,它能够搜索50,000条记录)。现在我试图在csv中下载所有这些记录。如果记录较少,那么它的工作正常,但当它超过30,000时,它正在抛出

编辑: -

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

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

2 个答案:

答案 0 :(得分:2)

不是将所有内容写入内存缓冲区中的巨型内容,而是在内存中创建巨型内存字符串副本,而是从Writer获取HttpServletResponse并在创建时将CSV直接写入客户端。通过这种方式,您可以将数据从网络中刷新到客户端,而不必在发送整个内容之前将其整个副本保留在RAM中。

当然,也可以让堆更大!

答案 1 :(得分:1)

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

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