@lordekar

Какое условие выбрасывания StackOverflowError?

Допустим имеем метод
public static void foo(){
    foo();
}

Запускаем и выкидывает StackOverflowError. В доках написано: "Thrown when a stack overflow occurs because an application recurses too deeply." Что значит too deeply, как джава понимает этот лимит? 1000, 10000 вложений?
  • Вопрос задан
  • 276 просмотров
Решения вопроса 2
AMar4enko
@AMar4enko
Ну очевидно, что у компилятора есть максимально допустимый размер стека вызовов.
При вызове функции в стек кладется определенный набор данных. При обычной (не хвостовой) рекурсии, каждый вложенный вызов функции будет увеличивать стек на N байт. В определенный момент (в какой именно - зависит от нескольких факторов, в их числе количество и типы параметров функции, макс. размер стека) стеку будет расти некуда, и вывалится эта ошибка.
Ответ написан
Комментировать
vlad20012
@vlad20012
В дополнение к предыдущему ответу - есть параметр -XX:MaxJavaStackTraceDepth=1024. Т.е. если размер стека вызовов превысит 1024, будет брошен StackOverflowError. По умолчанию выставлено 1024. Но это, как уже было сказано, не единственная возможная причина возникновения данного исключения.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы