Поскольку это хороший вопрос, я обновил заголовок до того, что, как мне кажется, более четко связано со значением. (Ранее я думал, что вы, возможно, имеете в виду глубину определенного стека, который вы захватили во время выполнения, например). Если вы не согласны, можете вернуть его обратно.
Анджей Дойл
Ответы:
62
Это зависит от объема виртуальной памяти, выделенной стеку.
И, возможно, размер стека, который вы на него кладете?
duffymo
1
Предел также зависит от использования стека в функции.
Ярек Пшигодски
1
если мы не упомянем Xss, тогда?
a3.14_Infinity 04
31
Я тестировал свою систему и не нашел никакого постоянного значения, иногда переполнение стека происходит после 8900 вызовов, иногда только после 7700, случайных чисел.
Разве это не хвостовая рекурсия и никогда не должно переполняться? Изменить: извините. В Java он разбился на 8027; в Scala до 8594755, пока мне не стало скучно.
Arya
9
@arya важной частью семантики JVM является то, что хвостовая рекурсия не поддерживается. Это создает множество интересных проблем для тех, кто хочет реализовать языки с хвостовой рекурсией на JVM.
Thorbjørn Ravn Andersen
2
public foo() { try { foo(); } finally { foo(); } }может работать «виртуально» вечно, но только в java.
Felype
для меня, StackOverflowErrorпроисходит после 8792
ericdemo07 05
2
Оптимизация хвостовой рекурсии @ ThorbjørnRavnAndersen не поддерживается. Скорее всего, у вас может быть хвостовая рекурсия. Он просто не оптимизирует его, чтобы не увеличивать стек вызовов.
slim
19
Размер стека можно установить с помощью -Xssпереключателя командной строки, но, как правило, он достаточно глубокий, сотни, если не тысячи вызовов. (Значение по умолчанию зависит от платформы, но не менее 256 КБ на большинстве платформ.)
Если вы получаете переполнение стека, в 99% случаев это вызвано ошибкой в коде.
Ответы:
Это зависит от объема виртуальной памяти, выделенной стеку.
http://www.odi.ch/weblog/posting.php?posting=411
Вы можете настроить это с помощью
-Xss
параметра виртуальной машины илиThread(ThreadGroup, Runnable, String, long)
конструктора.источник
Я тестировал свою систему и не нашел никакого постоянного значения, иногда переполнение стека происходит после 8900 вызовов, иногда только после 7700, случайных чисел.
источник
public foo() { try { foo(); } finally { foo(); } }
может работать «виртуально» вечно, но только в java.StackOverflowError
происходит после 8792Размер стека можно установить с помощью
-Xss
переключателя командной строки, но, как правило, он достаточно глубокий, сотни, если не тысячи вызовов. (Значение по умолчанию зависит от платформы, но не менее 256 КБ на большинстве платформ.)Если вы получаете переполнение стека, в 99% случаев это вызвано ошибкой в коде.
источник
Сравните эти два вызова:
(1) Статический метод:
(2) Нестатический метод с использованием другого класса:
Класс тестовой рекурсии имеет
public int testRecursion(int number) {
единственный метод.источник