Quelle est la profondeur maximale de la stack d’appels java?

A quel point dois-je aller dans la stack d’appels avant d’obtenir une erreur StackOverflowError? La plateforme de réponse dépend-elle?

Cela dépend de la quantité de mémoire virtuelle allouée à la stack.

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

Vous pouvez régler ceci avec le paramètre -Xss VM ou avec le constructeur Thread(ThreadGroup, Runnable, Ssortingng, long) .

J’ai testé sur mon système et je n’ai trouvé aucune valeur constante, parfois le débordement de stack se produit après 8900 appels, parfois seulement après 7700, des nombres aléatoires.

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

La taille de la stack peut être définie avec le commutateur de ligne de commande -Xss , mais en règle générale, elle est suffisamment profonde, des centaines sinon des milliers d’appels. (La valeur par défaut dépend de la plate-forme, mais d’au moins 256 ko dans la plupart des plates-formes).

Si vous obtenez un dépassement de stack, 99% du temps est causé par une erreur dans le code.

Comparez ces deux appels:
(1) Méthode statique:

 public static void main(Ssortingng[] 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) Méthode non statique utilisant une classe différente:

 public static void main(Ssortingng[] 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 

La classe de récurrence de test a public int testRecursion(int number) { comme seule méthode.