Java Out of heap,Stack Overflow错误

时间:2014-04-10 07:36:03

标签: java json jackson apache-camel pojo

我在实现Camel Route时遇到问题,我在其中调用URl并将JSON Response转换为Pojo。我使用Camel-Jackson。

连接与状态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。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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