De quelle profondeur ai-je besoin pour accéder à la pile d'appels avant d'obtenir une StackOverflowError? La plate-forme de réponse dépend-elle?
De quelle profondeur ai-je besoin pour accéder à la pile d'appels avant d'obtenir une StackOverflowError? La plate-forme de réponse dépend-elle?
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 -Xssparamètre VM ou avec le Thread(ThreadGroup, Runnable, String, long)constructeur.
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.
public class MainClass {
private static long depth=0L;
public static void main(String[] args){
deep();
}
private static void deep(){
System.err.println(++depth);
deep();
}
}
public foo() { try { foo(); } finally { foo(); } }peut fonctionner «virtuellement» pour toujours, en Java uniquement.
StackOverflowErrorse produit après 8792
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.
Comparez ces deux appels:
(1) Méthode statique:
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) Méthode non statique utilisant une classe différente:
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
La classe de récursivité de test a public int testRecursion(int number) {comme seule méthode.