【问题标题】:Send huge json object from Java Servlet从 Java Servlet 发送巨大的 json 对象
【发布时间】:2014-10-16 03:57:33
【问题描述】:

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 对象?

【问题讨论】:

  • 为什么这么大?你不能把它分成许多更小的吗?我想在修复内存问题之后,这可能会遇到超时问题...
  • json。将大量数据复制到内存中是一种幼稚的方法,而且根本无法扩展。

标签: java json servlets


【解决方案1】:

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

将所有内容都存储到内存中很方便,但在遇到任何限制时并不是很明智。一个一个地处理您的数据库记录并立即流式传输到客户端,而不是在内存中复制。经验法则:“任何给定的限制都会在某个时候超出。”

【讨论】:

  • 或者将一次发送给客户端的记录数限制为一个可配置的数量,而是分多个小批量发送。 +99(如果可能)对于该经验法则:“任何给定的限制都会在某个时候被超出。”
  • 我将数据保存在 json 对象中,因为我在发送数据之前对数据进行了一些操作。 Json 对象还包含其他信息。有什么方法可以发送这个 json 对象而不会出错。谢谢
  • 把你的Json分解成其他的,一个接一个的发送,这样就不用在巨型Json上调用toString了
【解决方案2】:

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

“java.lang.OutOfMemoryError: Java heap space”错误会在你尝试向内存中的堆空间区域添加更多数据时触发,但是这些数据的大小超过了JVM在Java中可以容纳的大小堆空间。

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

java -Xmx1024m com.mycompany.MyClass

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-22
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多