【问题标题】:Java Out of heap, Stack Overflow errorJava堆外,堆栈溢出错误
【发布时间】:2014-04-10 07:36:02
【问题描述】:

我在实现 Camel Route 时遇到问题,我在其中调用 URl 并将 JSON 响应转换为 Pojo。我使用骆驼杰克逊。

连接建立,状态为 200。

但我明白了

at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:541)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:644)
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:152)
caused because of java.lang.StackOverflowError. 

这是一个示例代码

from("direct:start")
    .setHeader(Exchange.HTTP_METHOD, constant("GET"))
    .to("URL")
    .process(new Processor() {
        @Override
        public void process(Exchange exchange) throws Exception {
            int responseCode = exchange.getIn().getHeader(Exchange.HTTP_RESPONSE_CODE, Integer.class);
            System.out.println(exchange.getIn().getBody());
            System.out.println(responseCode);
        }
    })
    .marshal(cont)
    .process(new MyProcessor())
    .end();

cont 是杰克逊数据格式。我将堆内存增加到 1024 M。但它仍然显示堆栈溢出错误。但是 Json 文件只有 26 Kb。我使用http://www.jsonschema2pojo.org/‎ 站点为 json 创建 Pojos。

【问题讨论】:

  • 您可以使用 '-Xssm' 标志增加堆栈大小。
  • 是的,我做到了。我不能增加超过 1GB。我的内存占用了 2.2 GB。我在 ram 中的总可占用空间是 3.25 GB。但我猜这个程序需要更多..
  • 如果是这种情况,那么我认为 JonK:s 下面的回答是正确的分析。这听起来绝对像是失控递归。
  • 你绝对不应该给你的线程堆栈那么多空间。对于绝大多数应用程序,默认设置应该绰绰有余。如果我的线程堆栈需要的不仅仅是-Xss128k,我会认真查看我的代码,看看我应该改变什么以避免需要那么多。
  • 我的坏人。我给了 marshal 而不是 unmarshal()。很抱歉浪费了您宝贵的时间。谢谢!

标签: java json jackson apache-camel pojo


【解决方案1】:

一般来说,大量或无穷无尽的递归方法调用链是StackOverflowErrors 的罪魁祸首,尽管它们绝不是唯一的原因。您的其他问题之一是您的线程堆栈大小可能设置为较低的数字(如果您看到 StackOverflowError 但只有一个小的堆栈跟踪,这可能是正在发生的事情)。

如果您的堆栈跟踪只有少量帧,请检查您的 JVM 是否设置了 -Xss 启动选项。如果是,您可能需要将其更改为更大的值,如果不是,请尝试将-Xss256k 添加到您的 JVM 的启动选项中(对于 Windows x64 机器,默认值为 -Xss128k)。如果需要,可以进一步增加。

如果您的堆栈跟踪非常大,那么它更有可能是递归方法调用。您应该能够从跟踪本身判断递归调用哪些方法,然后可以寻求纠正行为。

【讨论】:

    【解决方案2】:

    您应该检查您的 JSON Java 类,如果它包含可能会破坏您的应用程序的递归循环。如果是这种情况,请将@JsonIgnore 添加到相关属性以打破循环。

    【讨论】:

      猜你喜欢
      • 2011-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-18
      • 2013-02-19
      • 2014-04-10
      • 2014-01-26
      • 2019-02-16
      相关资源
      最近更新 更多