자바 StackOverflowError

Muhammad Zeeshan 2023년10월12일
  1. Java의 java.lang.StackOverflowError
  2. java.lang.StackOverflowError의 원인
  3. Java의 java.lang.StackOverflowError 솔루션
자바 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를 유발하는 예제 프로그램의 문제에 대해 이야기해 봅시다.

  1. 우리는 스레드의 스택이 메소드, 프리미티브 데이터 유형, 변수, 객체 참조반환 값이 저장되는 곳에서 스레드가 수행하는 예를 논의했습니다. 모두 메모리를 사용하고 있습니다.
  2. 스레드 스택 크기가 할당된 최대 메모리 양을 초과하는 지점까지 증가하면 java.lang.StackOverflowError가 트리거됩니다.
  3. Main() 메서드는 이 프로그램에서 RecursiveFunction() 함수를 호출합니다. RecursiveFunction() 메서드는 반복적으로 자신을 호출하고 이 구현으로 인해 무한히 호출됩니다.

이 경우 RecursiveFunction() 메서드에 대한 호출 횟수에 제한이 없습니다. Thread's 스택 크기 제한은 수백 또는 수천 번의 반복 후에 초과됩니다.

우리가 논의한 코드는 숫자를 인쇄하지만 숫자를 종료시키는 조건은 없습니다. 이것이 java.lang.StackOverflowError의 원인이며 스택의 크기가 완전히 사용되어 더 이상 확장할 수 없음을 나타냅니다.

Java의 java.lang.StackOverflowError 솔루션

다음은 java.lang.StackOverflowError 예외에 대한 가능한 솔루션입니다.

재귀 라인 찾기

스레드 스택을 제대로 분석하고 계속 발생하는 선 패턴을 찾아야 합니다. 이 줄은 재귀적으로 호출되는 코드를 가리킵니다.

이러한 줄을 찾은 후에는 재귀가 끝나지 않는지 확인하기 위해 코드를 포괄적으로 분석해야 합니다.

스레드 크기 늘리기

더 많은 수의 명령을 위한 공간을 만들기 위해 Thread 스택의 크기를 늘릴 수 있습니다. 컴파일러의 매개변수를 변경하면 Thread 스택의 최대 크기를 늘릴 수 있습니다.

종료 조건

동일한 호출을 반복적으로 수행하지 않으려면 재귀 호출이 종료되도록 올바른 종료 조건 또는 기타 조건을 구현하기 위해 노력해야 합니다.

다음 예제 코드에서 발생한 문제를 해결할 수 있도록 종료 조건을 추가해 보겠습니다. z19에 도달할 때마다 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
Muhammad Zeeshan avatar Muhammad Zeeshan avatar

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

관련 문장 - Java Error