IT

Java 콜 스택의 최대 깊이는 얼마입니까?

itgroup 2022. 10. 30. 21:36
반응형

Java 콜 스택의 최대 깊이는 얼마입니까?

Stack Overflow Error가 발생하기 전에 콜스택에 얼마나 깊이 들어가야 합니까?응답 플랫폼은 의존합니까?

스택에 할당된 가상 메모리의 양에 따라 달라집니다.

http://www.odi.ch/weblog/posting.php?posting=411

이 튜닝은,-XssVM 파라미터 또는Thread(ThreadGroup, Runnable, String, long)컨스트럭터

시스템에서 테스트했지만 일정한 값을 찾을 수 없었습니다.스택 오버플로는 8900 콜 후에 발생할 수 있으며, 7700 콜 후에 발생할 수도 있습니다.

public class MainClass {

    private static long depth=0L;

    public static void main(String[] args){
        deep(); 
    }

    private static void deep(){
        System.err.println(++depth);
        deep();
    }

}

스택 사이즈는 다음과 같이 설정할 수 있습니다.-Xss커맨드 라인 스위치이지만, 경험상으로는 충분히 깊고, 콜의 깊이가 수백은 되지 않습니다.(기본값은 플랫폼에 의존하지만, 대부분의 플랫폼에서는 256k 이상입니다.)

스택 오버플로가 발생하면 99%가 코드의 오류로 인해 발생합니다.

다음의 2개의 콜을 비교합니다.
(1) 정적 방법:

public static void main(String[] args) {
    int i = 14400; 
    while(true){   
        int myResult = testRecursion(i);
        System.out.println(myResult);
        i++;
    }
}

public static int testRecursion(int number) {
    if (number == 1) {
        return 1;
    } else {
        int result = 1 + testRecursion(number - 1);
        return result;
    }    
}
 //Exception in thread "main" java.lang.StackOverflowError after 62844

(2) 다른 클래스를 사용하는 비정적 방법:

public static void main(String[] args) {
    int i = 14400;
    while(true){       
        TestRecursion tr = new TestRecursion ();
        int myResult = tr.testRecursion(i);
        System.out.println(myResult);
        i++;
    }
} 
//Exception in thread "main" java.lang.StackOverflowError after 14002

테스트 재귀 클래스에는 다음이 있습니다.public int testRecursion(int number) {유일한 방법으로서

언급URL : https://stackoverflow.com/questions/4734108/what-is-the-maximum-depth-of-the-java-call-stack

반응형