2013-07-18 4 views
4

그래서 나는 꽤 피클에 빠졌습니다. 처음 DFS 알고리즘을 만들 때 재귀를 사용했습니다. 이로 인해 StackOverflow 오류가 발생했습니다. 음 ... 큰 문제는 아니지만 단지 반복으로 변환 할 것입니다. 그래서 코드를 반복하여 변환하고 스택을 사용하여 메서드 호출을 복제했습니다. 그러나 이제 OutOfMemoryError가 발생합니다.DFS가있는 OutOfMemoryError

나는 실제로 내 문제를 발견했다. 순환 의존성이 있었다. (Stupid me) 그러나 순환 의존성이 없다면 다른 누군가가 어떻게 접근했는지 궁금합니다. 나는 이것이 자바에서 언급되어야한다.

무한 루프가 없다는 것을 알았지 만 DFS 검색의 스택으로 인해 OutOfMemoryError가 발생하는 경우 내 질문은 무엇을 해야할지 꽤 궁금합니다.

+0

검색/해결하려는 문제 유형을 설명해 주시겠습니까? 나에게 그것은 DFS가 당신이 해결하려고하는 문제 유형에 적합하지 않은 것 같다. DFS가 예상치 못한 지점 중 하나에 갇혀 있기 때문에 결코 도달 할 수없는 지점에 솔루션이있을 수 있습니다. 그러나 이것조차도 가능하지 않을 것입니다. 아마 당신은 너무 많은 메모리를 할당하고 보유하고있을 것입니다. – Ma3x

답변

3

스택 오버 플로우와 메모리 부족 오류의 일반적인 원인은 프로그램이 O (n) 저장소 (또는 그 이상)를 필요로하는 알고리즘을 사용한다는 것입니다. 가장 좋은 방법은 알고리즘을 사용하여 더 적은 메모리를 사용하는 것입니다 O (1) 또는 O (log n)와 같은 저장소. 가장 일반적인 예는 큰 파일을 O (n) 인 메모리에 전체적으로 읽는 대신 고정 크기 블록, 즉 O (1) 저장소로 처리하는 것입니다.

이러한 오류의 또 다른 일반적인 원인은 간단한 실수입니다. 즉, 필요없는 가비지를 축적하거나 알고리즘이 존재하는 객체를 재사용해야 할 때 새 객체를 만드는 것입니다. 또한이 경우 적절한 해결책은 버그를 찾고 수정하는 것입니다.

당신은 당신이 합리적으로 그것을 만들 수에, -Xms-Xmx를 스택의 크기를 설정합니다 (JVM 메모리 매개 변수 -Xss을 재생하는 것이 의미가 더 메모리 버그가 없음으로 알고리즘은 메모리와 같은 보수적 확신 경우에만 초기 및 최대 힙 크기 설정).

1

StackOverflow는 재귀 알고리즘을 사용했기 때문에 함수 스택에 대한 메모리 스택이 오버플로되었음을 의미합니다. 스택 포인터, 프레임 및 리턴 포인터의 작동 방식을 이해하려면 호출 스택 문서를 살펴보십시오. Call Stack

반복 알고리즘을 만들었 으면 저장중인 변수가 호출 스택에 없기 때문에 메모리가 부족합니다 함수 자체의 메모리에 저장됩니다 (동일한 스택 프레임 내에서).

물론 기술적으로 두 오류는 메모리가 남아 있지 않다는 것을 의미하지만 각기 다른 방식으로 발생합니다. 하나는 메서드에 대한 끝나지 않는 재귀 호출이고 다른 하나는 메모리 오버플로입니다. 편집 한 질문에 관해서

편집 , 나는 시스템에 충분한 메모리가없는 않는 한 유래가없는 무한 루프 또는 재귀 일어날 수 있다고 생각하지 않습니다. RAM을 더 추가 할 수 있습니까?

+0

내 질문에 고마워. 재귀 부분은 제 질문에 맞지 않기 때문에 제거했습니다. (그것은 나의 원래 질문의 일부였다) – Taztingo

1

거의 모든 경우에 메모리 관련 예외가 발생하면 가장 먼저해야 할 일은 오랫동안 열심히 생각하는 것입니다 (아마도 메모리 프로파일 러가 도움을 줄 수 있음). 더 이상 필요하지 않은 데이터를 보유 할 가능성이 매우 높습니다.

그렇다면 프로그램이 효율적인 방식으로 작동하고 데이터 세트의 크기 및/또는 복잡성으로 인해 문제가 발생했다면 응용 프로그램에서 사용하는 스택 또는 힙을 늘릴 수 있습니다 :

-Xss64m 

세트

-Xmx1024m 

세트가 1 기가로 크기를 힙 64 메가로 크기를 스택.