2014-04-10 4 views
0

Camel Route를 구현하는 데 문제가 있습니다. 여기에서 URl을 호출하고 JSON 응답을 Pojo로 변환합니다. 나는 Camel-Jackson을 사용합니다. 다음은 샘플 코드Java 힙 부족, 스택 오버플로 오류

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는 잭슨의 데이터 형식입니다

연결 상태 (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. 

를 얻을. 나는 힙 메모리를 1024M로 늘렸다. 그러나 여전히 스택 오버플로 오류를 보여주고있다. 그러나 Json 파일은 단지 26KB입니다. 나는 http://www.jsonschema2pojo.org/ 사이트를 사용하여 json의 Pojos를 만들었습니다.

+0

'-Xss m'플래그를 사용하여 스택 크기를 늘릴 수 있습니다. – Erik

+0

예. 나는 1GB 이상 증가 할 수 없다. 내 내부 메모리 2.2 기가 바이트에 대한 점령있다. 램의 총 점유 공간은 3.25GB입니다. 그러나 나는 프로그램이 더 많은 것을 요구한다고 생각합니다. – bks4line

+0

그럴 경우 아래의 JonK : s 응답은 올바른 분석이라고 생각합니다. 그것은 도망 간 재귀 같은 것 같습니다. – Erik

답변

2

일반적으로 StackOverflowError의 크롤 또는 무한 사슬 체인이 있습니다. 이는 결코 인데 원인이 아닙니다. 다른 문제 중 하나는 스레드 스택 크기가 낮은 숫자로 설정 될 수 있다는 것입니다 (StackOverflowError이 표시되지만 작은 스택 추적 만있는 경우 이것이 발생했을 가능성이 큽니다).

스택 추적의 프레임 수가 적을 경우 JVM에 -Xss 실행 옵션 세트가 있는지 확인하십시오. 그렇다면 더 큰 것으로 변경해야 할 수도 있습니다. 그런 다음 JVM의 실행 옵션에 -Xss256k을 추가하지 않으면 (기본값은 Windows x64 시스템의 경우 -Xss128k입니다). 필요한 경우 추가로 늘릴 수 있습니다.

스택 추적이 꽤 큰 경우 재귀 메서드 호출 일 가능성이 큽니다. 트레이스 자체에서 어떤 메소드가 재귀 적으로 호출되는지 알 수 있어야하며, 그런 다음 동작을 바로 잡을 수 있습니다.

0

JSON Java 클래스에 응용 프로그램을 파괴 할 수있는 순환이 포함되어 있는지 확인해야합니다. 이 경우에는 해당 속성에 @JsonIgnore을 추가하여주기를 중단하십시오.