자바 StackOverflowError
-
Java의
java.lang.StackOverflowError
-
java.lang.StackOverflowError
의 원인 -
Java의
java.lang.StackOverflowError
솔루션
이 기사는 Java 프로그램의 main()
메소드에서 java.lang.StackOverflowError
오류의 가능한 원인을 다룹니다.
Java의 java.lang.StackOverflowError
Java에서 java.lang.StackOverflowError
가 발생하여 특히 깊은 재귀로 인해 애플리케이션의 스택이 고갈되었음을 알립니다. java.lang.StackOverflowError
클래스는 VirtualMachineError
클래스의 확장으로, JVM
이 오작동하거나 리소스를 모두 소모하여 작동할 수 없음을 나타냅니다.
java.lang.StackOverflowError
의 원인
java.lang.StackOverflowError
와 그 발생 원인을 이해하기 위한 예를 살펴보겠습니다.
먼저 예제 클래스에 기본 메서드를 포함합니다. 그런 다음 메인 메서드 내에서 재귀적으로 호출되는 RecursiveFunction()
이라는 함수를 빌드합니다.
RecursiveFunction()
함수에서 각 호출 후에 추가된 1
증분으로 숫자를 표시합니다.
완전한 소스 코드:
public class example {
static int z;
public static int RecursiveFunction(int e) {
z = z + 1;
System.out.println(" Number is : " + z);
return z + RecursiveFunction(z + 1);
}
public static void main(String[] args) {
example.RecursiveFunction(z);
}
}
아래와 같은 유사한 결과를 얻을 수 있습니다.
출력:
Exception in thread “main” java.lang.StackOverflowError
at java.io.PrintStream.write(Unknown Source)
at java.io.PrintStream.print(Unknown Source)
at java.io.PrintStream.println(Unknown Source)
at StackOverflowErrorClass.RecursiveFunction(StackOverflowErrorClass.java:7)
at StackOverflowErrorClass.RecursiveFunction(StackOverflowErrorClass.java:8)
at StackOverflowErrorClass.RecursiveFunction(StackOverflowErrorClass.java:8)
.
.
.
java.lang.StackOverflowError
를 유발하는 예제 프로그램의 문제에 대해 이야기해 봅시다.
- 우리는
스레드
의 스택이 메소드, 프리미티브데이터 유형
,변수
,객체 참조
및반환
값이 저장되는 곳에서스레드
가 수행하는 예를 논의했습니다. 모두 메모리를 사용하고 있습니다. 스레드
스택 크기가 할당된 최대 메모리 양을 초과하는 지점까지 증가하면java.lang.StackOverflowError
가 트리거됩니다.Main()
메서드는 이 프로그램에서RecursiveFunction()
함수를 호출합니다.RecursiveFunction()
메서드는 반복적으로 자신을 호출하고 이 구현으로 인해 무한히 호출됩니다.
이 경우 RecursiveFunction()
메서드에 대한 호출 횟수에 제한이 없습니다. Thread's
스택 크기 제한은 수백 또는 수천 번의 반복 후에 초과됩니다.
우리가 논의한 코드는 숫자를 인쇄하지만 숫자를 종료시키는 조건은 없습니다. 이것이 java.lang.StackOverflowError
의 원인이며 스택의 크기가 완전히 사용되어 더 이상 확장할 수 없음을 나타냅니다.
Java의 java.lang.StackOverflowError
솔루션
다음은 java.lang.StackOverflowError
예외에 대한 가능한 솔루션입니다.
재귀 라인 찾기
스레드
스택을 제대로 분석하고 계속 발생하는 선 패턴을 찾아야 합니다. 이 줄은 재귀적으로 호출되는 코드를 가리킵니다.
이러한 줄을 찾은 후에는 재귀가 끝나지 않는지 확인하기 위해 코드를 포괄적으로 분석해야 합니다.
스레드 크기 늘리기
더 많은 수의 명령을 위한 공간을 만들기 위해 Thread
스택의 크기를 늘릴 수 있습니다. 컴파일러의 매개변수를 변경하면 Thread
스택의 최대 크기를 늘릴 수 있습니다.
종료 조건
동일한 호출을 반복적으로 수행하지 않으려면 재귀 호출이 종료되도록 올바른 종료 조건 또는 기타 조건을 구현하기 위해 노력해야 합니다.
다음 예제 코드에서 발생한 문제를 해결할 수 있도록 종료 조건을 추가해 보겠습니다. z
가 19
에 도달할 때마다 if
문을 사용하여 확인합니다. 기능을 종료합니다.
if (z == 19)
return z;
완전한 소스 코드:
public class example {
static int z;
public static int RecursiveFunction(int e) {
z = z + 1;
System.out.println(" Number is : " + z);
if (z == 19)
return z;
return z + RecursiveFunction(z + 1);
}
public static void main(String[] args) {
example.RecursiveFunction(z);
}
}
출력:
Number is : 1
Number is : 2
Number is : 3
Number is : 4
Number is : 5
Number is : 6
Number is : 7
Number is : 8
Number is : 9
Number is : 10
Number is : 11
Number is : 12
Number is : 13
Number is : 14
Number is : 15
Number is : 16
Number is : 17
Number is : 18
Number is : 19
I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.
LinkedIn