从Java Servlet发送巨大的json对象

时间:2014-08-22 10:11:53

标签: java json servlets

Java servlet返回JSON对象。

response.setContentType("application/json");
response.getWriter().write(json.toString()); 

JSON对象包含从表(数据库)获取的数据,其大小为> 50 MB。

运行时,servlet会抛出此错误:

java.lang.OutOfMemoryError: Java heap space

似乎问题在于编写json数据。服务器无法分配大小的连续内存>字符串50 MB。

我无法找到解决此问题的方法。如何从Servlet发送巨大的JSON对象?

2 个答案:

答案 0 :(得分:5)

json.toString()可能会导致错误。在发送任何内容之前,它会从现有的json对象创建一个大字符串。

将所有东西都插入内存很方便,但在任何限制方面都不是很明智。逐个处理数据库记录并立即流式传输到客户端,而不是在内存中复制。经验法则:“任何时候都会超出限制。”

答案 1 :(得分:1)

将JSON数据结构拆分成更小的部分绝对是解决手头问题的一种方法。但是,通过堆大小增加的替代方案也可以在这种情况下完成工作。

当您尝试将更多数据添加到内存中的堆空间区域时,将触发“java.lang.OutOfMemoryError:Java堆空间”错误,但此数据的大小大于JVM在Java中可容纳的大小堆空间。

请注意,JVM从启动时指定的操作系统获取的内存有限。有几个启动参数控制分配的单独内存区域,但在您的情况下,您对堆区域感兴趣,您可以设置(或增加,如果存在)类似于以下示例将堆大小设置为1GB:

java -Xmx1024m com.mycompany.MyClass