¿Qué tan profundo debo ingresar a la pila de llamadas antes de obtener un StackOverflowError? ¿La plataforma de respuesta es dependiente?¿Cuál es la profundidad máxima de la pila de llamadas java?
Respuesta
Depende de la cantidad de memoria virtual asignada a la pila.
http://www.odi.ch/weblog/posting.php?posting=411
Se puede sintonizar esto con el parámetro -Xss
VM o con el Thread(ThreadGroup, Runnable, String, long)
constructor.
Y tal vez el tamaño de los marcos de pila que está poniendo en él? – duffymo
El límite también depende del uso de la pila en la función. –
si no mencionamos el Xss, entonces? –
El tamaño de pila se puede establecer con el modificador de línea de comandos -Xss
, pero como regla general, es lo suficientemente profundo, cientos o miles de llamadas de profundidad. (El valor predeterminado depende de la plataforma, pero al menos 256k en la mayoría de las plataformas).
Si obtiene un desbordamiento de la pila, el 99% del tiempo es causado por un error en el código.
+1 para el segundo párrafo. Uno siempre debe recordar acerca de eso. – mcveat
Usando eclipse, solo recibo 1024 llamadas recursivas. – Norswap
@Norswap ¿Lo está determinando por el tamaño del seguimiento de pila? Eso parece estar limitado a 1024 independientemente del tamaño real de la pila. –
Probé en mi sistema y no encontré ningún valor constante, a veces el desbordamiento de pila ocurre después de las llamadas 8900, a veces solo después de 7700, números aleatorios.
public class MainClass {
private static long depth=0L;
public static void main(String[] args){
deep();
}
private static void deep(){
System.err.println(++depth);
deep();
}
}
¿No es el caso que esto es recursivo en la cola y no debería desbordarse nunca? Editar: Lo siento. En Java, se bloqueó en 8027; en Scala llegó a 8594755 antes de que me aburriera. – arya
@arya una parte importante de la semántica de JVM es que la repetición de cola no es compatible. Esto ofrece muchos problemas interesantes para aquellos que quieren implementar lenguajes con recursión de cola en la JVM. –
'public foo() {try {foo(); } finalmente {foo(); }} ' puede ejecutarse 'virtualmente' para siempre, solo en java. – Felype
comparar estos dos llamadas:
(1) Método estático:
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étodo no estático usando una clase diferente: Clase de recursión
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
prueba tiene public int testRecursion(int number) {
como el único método.
- 1. Encontrar la profundidad máxima de un árbol
- 2. ¿Cómo puedo medir la profundidad de la pila de hilos?
- 3. ¿Cuál es la mejor pila Java SIP?
- 4. Error # 1030: La profundidad de pila es desequilibrada
- 5. Tocando la máxima profundidad de recursión usando Pickle/cPickle
- 6. Navegar por la pila de llamadas Java en Eclipse
- 7. determinar la profundidad de la pila en javascript mediante javascript
- 8. ¿Está bien que la profundidad de la pila sea proporcional a algún tamaño de entrada?
- 9. ¿Cómo aumentar la cantidad máxima de llamadas en Javascript?
- 10. ¿Cuál es la demora máxima para setInterval?
- 11. Python sched.scheduler excede la profundidad máxima de recursión
- 12. Capture la pila de llamadas rápidamente
- 13. ¿Cuál es el propósito de la ventana Pila de llamadas en Visual Studio?
- 14. Para el registro de C#, ¿cómo obtengo la profundidad de la pila de llamadas con una sobrecarga mínima?
- 15. Beautifulsoup, profundidad máxima de recursión alcanzada
- 16. Python: Profundidad de recursión máxima excedida
- 17. Android: aumentar el tamaño de la pila de llamadas
- 18. ¿Cuál es la longitud máxima de cuadro de texto HTML
- 19. ¿Cuál es la capacidad de almacenamiento máxima de Core Data?
- 20. ¿Cuál es la longitud máxima de una propiedad de lista?
- 21. ¿Cuál es la diferencia entre la pila de un subproceso y la pila de un proceso?
- 22. ¿Cuál es la "manera funcional" de evitar pasar contexto de selección de estado por la pila de llamadas?
- 23. ¿Cuál es la longitud máxima de una cadena en PHP?
- 24. Cuál es la diferencia de zona horaria máxima posible
- 25. ¿Cuál es la longitud máxima posible de una cadena .NET?
- 26. ¿Cuál es la longitud máxima de una consulta mongodb?
- 27. ¿Cuál es la tasa de compresión máxima teóricamente posible?
- 28. ¿Cuál es la cantidad máxima de archivos por jarra?
- 29. ¿Cuál es la longitud máxima de un objeto NSString?
- 30. Cómo filtrar la pila de llamadas en la vista de depuración Eclipse para Java
Muy relacionado: http://stackoverflow.com/questions/794227/how-to-know-about-outofmemory-or-stackoverflow-errors-ahead-of-time – finnw
Dado que esta es una buena pregunta, he actualicé el título a algo que siento que está más claramente asociado con el significado. (Anteriormente, pensé que te estarías refiriendo a la profundidad de una pila * particular * que habías capturado en tiempo de ejecución, por ejemplo). Siéntete libre de cambiarlo si no estás de acuerdo. –
@Andrzej - sin objeciones. – ripper234