>Java >java지도 시간 >StackOverflowError를 방지하기 위해 Java 스택 크기를 어떻게 늘릴 수 있습니까?

StackOverflowError를 방지하기 위해 Java 스택 크기를 어떻게 늘릴 수 있습니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-17 02:35:25841검색

How Can I Increase the Java Stack Size to Prevent StackOverflowErrors?

더 큰 호출 스택을 위해 Java 스택 크기 늘리기

JVM(Java Virtual Machine)은 각 스레드에 대한 런타임 호출 스택을 유지 관리합니다. 스택 크기가 딥 호출 스택을 처리하기에 충분하지 않으면 StackOverflowError가 발생합니다. 더 큰 호출 스택을 수용하기 위해 이 스택 크기를 확장하려면 java -Xss... 명령줄 플래그를 활용하세요.

예를 들어 코드 조각에서 다음과 같습니다.

public class TT {
  public static long fact(int n) {
    return n < 2 ? 1 : n * fact(n - 1);
  }
}

Fact(2^15) 계산에서는 다음을 사용할 수 있습니다. 다음:

java -Xss4m TT

구현별 및 스레드별 스택 구성

-X... 플래그는 구현에 따라 다릅니다. 귀하의 경우 OpenJDK의 JVM을 사용하고 있습니다. 또한 특정 스레드에 대해서만 더 큰 스택 크기를 지정하여 이를 필요로 하지 않는 스레드에 대한 메모리 낭비를 방지할 수 있습니다. 이는 java -Xss를 사용하는 것보다 바람직합니다....

필요한 스택 크기 추정

-을 점진적으로 늘려 프로그램에 필요한 정확한 스택 크기를 결정할 수 있습니다. StackOverflowError가 발생하지 않고 원하는 계산을 처리할 때까지 Xss 값입니다.

비결정적 동작

때때로 스택 요구 사항이 비결정적일 수 있습니다. 가비지 수집이나 JIT 컴파일과 같은 요인이 이 동작에 영향을 줄 수 있습니다.

대체 구현: 반복 및 재귀

알고리즘의 스택 집약적이지 않은 대안 구현을 고려하세요. 팩트 함수의 경우 반복 구현은 스택 오버플로가 발생할 가능성이 낮습니다.

public class TTIterative {
  public static long fact(int n) {
    if (n < 2) return 1;
    if (n > 65) return 0;
    long f = 2;
    for (int i = 3; i <= n; ++i) {
      f *= i;
    }
    return f;
  }
}

긴 데이터 유형의 제한으로 인해 팩트 함수는 65보다 큰 숫자에 대해 정확한 계승을 계산할 수 없다는 점을 기억하세요. 이 제한을 극복하려면 대신 BigInteger를 반환하는 것이 좋습니다.

위 내용은 StackOverflowError를 방지하기 위해 Java 스택 크기를 어떻게 늘릴 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.