In che misura ho bisogno di entrare nello stack di chiamate prima di ottenere un StackOverflowError? La piattaforma di risposta è dipendente?Qual è la profondità massima dello stack di chiamate java?
risposta
Dipende dalla quantità di memoria virtuale allocata allo stack.
http://www.odi.ch/weblog/posting.php?posting=411
È possibile ottimizzare questo con il parametro -Xss
VM o con il costruttore Thread(ThreadGroup, Runnable, String, long)
.
E forse la dimensione dei frame dello stack che stai mettendo su di esso? – duffymo
Il limite dipende anche dall'utilizzo dello stack nella funzione. –
se non menzioniamo l'Xss, allora? –
La dimensione dello stack può essere impostata con l'interruttore della riga di comando -Xss
ma, in linea di massima, è abbastanza profondo, centinaia se non migliaia di chiamate in profondità. (L'impostazione predefinita dipende dalla piattaforma, ma almeno 256k nella maggior parte delle piattaforme.)
Se si verifica un overflow di stack, il 99% delle volte è causato da un errore nel codice.
+1 per il secondo paragrafo. Uno dovrebbe sempre ricordarlo. – mcveat
Usando eclipse, ricevo solo 1024 chiamate ricorsive. – Norswap
@Norswap Lo stai determinando in base alla dimensione della traccia dello stack? Sembra essere limitato a 1024 indipendentemente dalle dimensioni effettive dello stack. –
Ho eseguito il test sul sistema e non ho trovato alcun valore costante, a volte l'overflow dello stack si verifica dopo 8900 chiamate, a volte solo dopo 7700, numeri casuali.
public class MainClass {
private static long depth=0L;
public static void main(String[] args){
deep();
}
private static void deep(){
System.err.println(++depth);
deep();
}
}
Non è il caso che questo è ricorsivo di coda e non dovrebbe mai traboccare? Modifica: mi dispiace In Java si è schiantato all'8027; in Scala è arrivato a 8594755 prima di annoiarmi. – arya
@arya una parte importante della semantica JVM è che la ricorsione della coda non è supportata. Ciò offre molti problemi interessanti per coloro che desiderano implementare le lingue con ricorsione in coda sulla JVM. –
'public foo() {try {pippo(); } finally {foo(); }} ' può essere eseguito 'virtualmente' per sempre, solo in Java. – Felype
confrontare questi due chiamate:
(1) Metodo statico:
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) il metodo non-statico utilizzando una classe diversa:
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
class Test ricorsione ha public int testRecursion(int number) {
come unico metodo.
- 1. JSpec - RangeError: Dimensione massima dello stack di chiamate superata
- 2. Meteor: dimensione massima dello stack di chiamate superata
- 3. Debugging "Dimensione massima stack di chiamate superato"
- 4. getter setter dimensione massima dello stack delle chiamate superata Errore
- 5. Come trovo la dimensione massima dello stack?
- 6. Trova la massima profondità di ricorsione
- 7. Elemento nascosto clic sul goniometro "RangeError: Superata la dimensione massima dello stack di chiamate"
- 8. Come aumentare la dimensione massima dello stack di chiamate in Node.js
- 9. Meteor RangeError: superata la dimensione massima dello stack di chiamate. sull'evento keypress
- 10. determina la profondità dello stack in javascript utilizzando javascript
- 11. Android: aumento delle dimensioni dello stack di chiamate
- 12. Ricorsione JavaScript: Dimensione massima stack di chiamate superata
- 13. Invio del modulo che causa il superamento della dimensione massima dello stack di chiamate
- 14. Mongoose - RangeError: Dimensione massima stack di chiamate superata
- 15. Dimensione massima stack di chiamate superata durante un setTimeout Chiama
- 16. qual è la dimensione dello stack in VC++?
- 17. Dimensione massima stack di chiamate superata durante JSON.stringify (navigator)
- 18. Uncaught RangeError: Dimensione massima stack di chiamate superato, JavaScript
- 19. Nowjs: [RangeError: Dimensione massima stack di chiamate superato]
- 20. Accesso allo stack di chiamate Java
- 21. La dimensione massima dello stack di chiamate ha superato in angularJS, quando provo ad usare | filter: searchText
- 22. Qual è la dimensione massima di Scripting.Dictionary?
- 23. Chiamate del browser e follia dello stack di attività Android
- 24. Massima profondità di ricorsione mediante Pickle/cPickle
- 25. Java Pattern causa overflow dello stack
- 26. Dimensione massima dello stack, ulimit -s, segfault 11 - come funziona?
- 27. La garbage stack è raccolta in Java?
- 28. Non capisco l'errore di overflow dello stack con ripetuto DispatchMessageW nello stack di chiamate
- 29. Stampa stack di chiamate completo su printStackTrace()?
- 30. schedario orario Python supera la profondità massima di ricorsione
Strettamente correlato: http://stackoverflow.com/questions/794227/how-to-know-about-outofmemory-or-stackoverflow-errors-ahead-of-time – finnw
Poiché questa è una buona domanda, ho aggiornato il titolo a qualcosa che ritengo sia associato più chiaramente al significato. (In precedenza ho pensato che potreste riferirvi alla profondità di uno * particolare * stack che avete catturato in fase di runtime, per esempio). Sentiti libero di cambiarlo se non sei d'accordo. –
@Andrzej - nessuna obiezione. – ripper234