StackOverflowError를 잡으려고 시도하고 다음 방법을 생각해 낼 때 어떤 일이 발생하는지 궁금합니다.
class RandomNumberGenerator {
static int cnt = 0;
public static void main(String[] args) {
try {
main(args);
} catch (StackOverflowError ignore) {
System.out.println(cnt++);
}
}
}
이제 내 질문 :
이 메서드는 왜 '4'를 인쇄합니까?
System.out.println()
콜 스택에서 3 개의 세그먼트가 필요 하기 때문이라고 생각했는데 3 번이 어디에서 오는지 모르겠습니다. 의 소스 코드 (및 바이트 코드)를 볼 System.out.println()
때 일반적으로 3보다 훨씬 많은 메서드 호출이 발생합니다 (따라서 호출 스택의 3 개 세그먼트로는 충분하지 않습니다). 핫스팟 VM이 적용되는 최적화 (메소드 인라인) 때문이라면 다른 VM에서 결과가 다를지 궁금합니다.
편집 :
출력이 매우 JVM 특정인 것처럼
보이므로 Java (TM) SE 런타임 환경 (빌드 1.6.0_41-b02)
Java HotSpot (TM) 64 비트 서버 VM (빌드 20.14-b01, 혼합 모드)을 사용하여 결과 4를 얻습니다.
이 질문이 Java 스택 이해와 다른 이유를 설명 하십시오 .
내 질문은 왜 cnt> 0이 있는지에 대한 것이 아니라 (분명히 System.out.println()
스택 크기가 필요하고 StackOverflowError
무언가가 인쇄되기 전에 다른 것을 던지기 때문입니다 ), 왜 특정 값이 4, 각각 0,3,8,55 또는 다른 무엇인지에 대한 것입니다. 시스템.
5
, 6
그리고 38
자바 1.7.0_10