2012-04-17 2 views
0

1 밀리 노드에 가까운 그래프가 있습니다.이 그래프에는 강하게 연결된 구성 요소가 계산됩니다. 나는 1만2백40메가바이트에 VM의 힙 크기를 증가,하지만 여전히이 예외를 던지고있다 :대형 그래프에서 Java 스택 오버 플로우 계산 SCC

Error: 875714 
Exception in thread "main" java.lang.StackOverflowError 
    at java.util.Stack.push(Stack.java:67) 

나는 코드가 문제지만, 크기가 아니라는 것을 절대적으로 확신합니다. 그 밖의 무엇을 할 수 있습니까?

업데이트 : StackOverflowError는 6 초 후에 VM을 설정 한 힙 크기에 관계없이 throw됩니다. 내가 StackOverflow.com에 StackOverflowError가를 해결할 수없는 경우

, 내가 StackOverflowErrorjava.util.Stack와는 아무 상관이 없다는 것을 명심)

+0

더 많은 코드가 필요합니다. 재귀 호출을 사용하는 경우 일반 루프를 사용하도록 코드를 변경해야 할 수 있습니다. –

+0

글쎄, 처음부터 스택 크기를 늘리지 않는 이유는 무엇입니까? 구글 그것. –

+0

스택 스택 메모리가 힙의 일부가 아니기 때문에 힙 크기는 StackOverflowErrors에 영향을 줄 수 없습니다. 스레드 스택 크기를 늘릴 수는 있지만 다른 JVM 옵션입니다. -Xss는 믿습니다. –

답변

1

= 설정하는 경우 다른 모른다 : 오류가 때 발생합니다 Stack 객체에 공간이없는 경우가 아니라 호출 스택 (즉, 너무 깊은 재귀)을위한 공간이 없습니다.

제가 제안하는 첫 번째 것은 알고리즘을 수정하는 것입니다. 내 눈먼 추측은 오버플로를 일으키는 인접 노드 방문에 대한 재귀를 사용하고 있다는 것입니다. 재귀 대신 루프를 사용하십시오.

단기적으로는 -Xss으로 스택 크기 (힙 크기 아님)를 늘릴 수도 있습니다. BTW, 각 스레드 자체 스택이 있음을 명심하십시오.

0

StackOverflowErrorOutOfMemoryError을 혼동하지 마십시오. A StackOverflowError은 ""일 때 OutOfMemoryError이 발생하는 반면 "when an application recurses too deeply"이 발생합니다.

StackOverflowError s가되었으므로 일부 재귀를 루프로 변환 할 수있는 위치를 찾으십시오. 도움이 될 것입니다.

관련 문제