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对象?
答案 0 :(得分:5)
json.toString()
可能会导致错误。在发送任何内容之前,它会从现有的json对象创建一个大字符串。
将所有东西都插入内存很方便,但在任何限制方面都不是很明智。逐个处理数据库记录并立即流式传输到客户端,而不是在内存中复制。经验法则:“任何时候都会超出限制。”
答案 1 :(得分:1)
将JSON数据结构拆分成更小的部分绝对是解决手头问题的一种方法。但是,通过堆大小增加的替代方案也可以在这种情况下完成工作。
当您尝试将更多数据添加到内存中的堆空间区域时,将触发“java.lang.OutOfMemoryError:Java堆空间”错误,但此数据的大小大于JVM在Java中可容纳的大小堆空间。
请注意,JVM从启动时指定的操作系统获取的内存有限。有几个启动参数控制分配的单独内存区域,但在您的情况下,您对堆区域感兴趣,您可以设置(或增加,如果存在)类似于以下示例将堆大小设置为1GB:
java -Xmx1024m com.mycompany.MyClass