Из JavaCodeGeeks:
Когда вызов функции вызывается приложением Java, в стеке вызовов выделяется кадр стека. Кадр стека содержит параметры вызванного метода, его локальные параметры и адрес возврата метода. Адрес возврата обозначает точку выполнения, с которой выполнение программы должно продолжаться после возврата вызванного метода. Если для нового фрейма стека нет места, то виртуальная машина Java (JVM) выдает ошибку StackOverflowError.
Итак, каждый раз, когда ваш метод вызывается рекурсивно, он создает новый стек. Если компьютер, на котором работает ваша программа, не может выделить память для такого большого количества стеков, JVM выдает ошибку StackOverFlowError.
В зависимости от установленной виртуальной машины Java (JVM), размер стека потока по умолчанию может равняться либо 512 КБ, либо 1 МБ. Вы можете увеличить размер стека потока, используя флаг -Xss. Этот флаг можно указать либо через конфигурацию проекта, либо через командную строку. Формат аргумента -Xss: -Xss [g | G | m | M | k | K].