Какова максимальная глубина стека вызовов java?

Насколько глубоко мне нужно идти в стек вызовов, прежде чем я получу StackOverflowError? Зависит ли платформа от ответа?

Это зависит от объема виртуальной памяти, выделенной стеку.

http://www.odi.ch/weblog/posting.php?posting=411

Вы можете настроить это с помощью параметра -Xss VM или с помощью конструктора Thread(ThreadGroup, Runnable, String, long) .

Я тестировал свою систему и не нашел постоянного значения, иногда переполнение стека происходит после 8900 вызовов, иногда только после 7700 случайных чисел.

 public class MainClass { private static long depth=0L; public static void main(String[] args){ deep(); } private static void deep(){ System.err.println(++depth); deep(); } } 

Размер стека можно установить с помощью -Xss командной строки -Xss но, как правило, это достаточно глубоко, сотни, если не тысячи вызовов. (Значение по умолчанию зависит от платформы, но не менее 256 тыс. На большинстве платформ.)

Если вы получаете переполнение стека, в 99% случаев это вызвано ошибкой в ​​коде.

Сравните эти два вызова:
(1) Статический метод:

 public static void main(String[] args) { int i = 14400; while(true){ int myResult = testRecursion(i); System.out.println(myResult); i++; } } public static int testRecursion(int number) { if (number == 1) { return 1; } else { int result = 1 + testRecursion(number - 1); return result; } } //Exception in thread "main" java.lang.StackOverflowError after 62844 в public static void main(String[] args) { int i = 14400; while(true){ int myResult = testRecursion(i); System.out.println(myResult); i++; } } public static int testRecursion(int number) { if (number == 1) { return 1; } else { int result = 1 + testRecursion(number - 1); return result; } } //Exception in thread "main" java.lang.StackOverflowError after 62844 

(2) Нестатический метод с использованием другого classа:

 public static void main(String[] args) { int i = 14400; while(true){ TestRecursion tr = new TestRecursion (); int myResult = tr.testRecursion(i); System.out.println(myResult); i++; } } //Exception in thread "main" java.lang.StackOverflowError after 14002 в public static void main(String[] args) { int i = 14400; while(true){ TestRecursion tr = new TestRecursion (); int myResult = tr.testRecursion(i); System.out.println(myResult); i++; } } //Exception in thread "main" java.lang.StackOverflowError after 14002 

Класс тестовой рекурсии имеет public int testRecursion(int number) { как единственный метод.

  • Как подключить внешний IP-адрес от Java Android
  • Как проверить, существует ли class в пакете?
  • как скачать изображение с любой веб-страницы в java
  • скопируйте 2d-массив в java
  • Сортировка ArrayList на основе поля объекта
  • Переменная не может быть разрешена
  • NoClassDefFoundError: android.support.v7.internal.view.menu.MenuBuilder
  • Runtime.exec (): перезагрузка в Android?
  • Возвращает значение из AsyncTask в Android
  • Нарисуйте прозрачный круг за пределами
  • Разрешение на запись на SD-карту
  • Давайте будем гением компьютера.