Comme c'est une bonne question, j'ai mis à jour le titre pour quelque chose qui me semble plus clairement associé à la signification. (Auparavant, je pensais que vous pourriez faire référence à la profondeur d'une pile particulière que vous aviez capturée au moment de l'exécution, par exemple). N'hésitez pas à le modifier si vous n'êtes pas d'accord.
Andrzej Doyle
Réponses:
60
Cela dépend de la quantité de mémoire virtuelle allouée à la pile.
Et peut-être la taille des cadres de pile que vous y mettez?
duffymo
1
La limite dépend également de l'utilisation de la pile dans la fonction.
Jarek Przygódzki
1
si nous ne mentionnons pas le Xss, alors?
a3.14_Infinity
31
J'ai testé sur mon système et je n'ai trouvé aucune valeur constante, parfois un débordement de pile se produit après 8900 appels, parfois seulement après 7700, des nombres aléatoires.
N'est-il pas vrai que c'est la queue récursive et ne devrait jamais déborder? Edit: Désolé. En Java, il s'est écrasé à 8027; à Scala, il est monté à 8594755 avant de m'ennuyer.
arya
9
@arya une partie importante de la sémantique JVM est que la récursivité de queue n'est pas prise en charge. Cela pose beaucoup de problèmes intéressants pour ceux qui veulent implémenter des langages avec une récursion de queue sur la JVM.
Thorbjørn Ravn Andersen
2
public foo() { try { foo(); } finally { foo(); } }peut fonctionner «virtuellement» pour toujours, en Java uniquement.
Felype
pour moi, StackOverflowErrorse produit après 8792
ericdemo07
2
@ L' optimisation de la récursivité de la queue ThorbjørnRavnAndersen n'est pas prise en charge. De toute évidence, vous pouvez avoir une récursivité de queue. Cela ne l'optimise tout simplement pas pour ne pas augmenter la pile d'appels.
slim
19
La taille de la pile peut être définie avec le -Xsscommutateur de ligne de commande, mais en règle générale, elle est suffisamment profonde, des centaines, voire des milliers d'appels. (La valeur par défaut dépend de la plate-forme, mais au moins 256 Ko dans la plupart des plates-formes.)
Si vous obtenez un débordement de pile, 99% du temps, il est causé par une erreur dans le code.
Réponses:
Cela dépend de la quantité de mémoire virtuelle allouée à la pile.
http://www.odi.ch/weblog/posting.php?posting=411
Vous pouvez régler cela avec le
-Xss
paramètre VM ou avec leThread(ThreadGroup, Runnable, String, long)
constructeur.la source
J'ai testé sur mon système et je n'ai trouvé aucune valeur constante, parfois un débordement de pile se produit après 8900 appels, parfois seulement après 7700, des nombres aléatoires.
la source
public foo() { try { foo(); } finally { foo(); } }
peut fonctionner «virtuellement» pour toujours, en Java uniquement.StackOverflowError
se produit après 8792La taille de la pile peut être définie avec le
-Xss
commutateur de ligne de commande, mais en règle générale, elle est suffisamment profonde, des centaines, voire des milliers d'appels. (La valeur par défaut dépend de la plate-forme, mais au moins 256 Ko dans la plupart des plates-formes.)Si vous obtenez un débordement de pile, 99% du temps, il est causé par une erreur dans le code.
la source
Comparez ces deux appels:
(1) Méthode statique:
(2) Méthode non statique utilisant une classe différente:
La classe de récursivité de test a
public int testRecursion(int number) {
comme seule méthode.la source