我想知道什么是java.lang.StackOverflowError的根本原因。 我知道它是在递归调用无限次的方法时发生的,但是异常的实际原因是什么以及默认的堆栈大小是多少?java.lang.StackOverflowError的根本原因
2
A
回答
0
只要内存的特定部分(“堆栈”)用完,就会发生stackoverflowerror。基本上你已经耗尽了分配给你的程序的内存,而不需要任何额外的内存,所以你的程序崩溃了。
具体来说,堆栈用于所有与调用函数和线程有关的东西,所以理论上你甚至可以通过创建一个新线程(尽管你首先需要几乎用函数调用填充它)来耗尽内存。此外,递归不需要是无限的,只是非常大。
public int foo(int i){
if (i=0)
return 0;
return (foo(i-1)+foo(i-1)%1000);
}
然后调用foo(10000)将导致没有无限的计算器。
如果您对发现堆栈更感兴趣,我会建议递归如何在更低级别的语言(如程序集)中工作,您可以真正看到机器正在做什么(请注意,学习这将花费很多负担得起,但会让你成为一个更好的程序员)。
1
只有在递归调用的情况下才会引发它。每当堆栈内存空间填充堆栈中的典型数据时就会抛出:局部变量,本地参数等等。
显然,获得堆栈溢出错误的机会随着堆栈的大小(当前正在执行的方法和线程的根之间有多少方法调用)以及活动线程的数量而增加。
但是,正如我所提到的,递归调用并不是获得大型堆栈的唯一原因。
0
1
的根本原因是这样的:堆栈大小是固定的在运行时,与VM提供没办法,一旦程序运行进行调整。但递归深度不固定,在许多情况下它取决于输入数据。这就是为什么递归深度有时候并不是所有的堆栈帧都适合堆栈的原因。
相关问题
- 1. 死锁的根本原因?
- 2. pthread_cond_timedwait()EINVAL的根本原因
- 3. 如何获取FacesException的根本原因?
- 4. Shellshock Bash bug的根本原因
- 5. 没有任何根本原因的IllegalStateException
- 6. Java根本原因java.lang.OutOfMemoryError错误
- 7. 多个Java根本原因异常
- 8. WCF CommunicationException:了解根本原因
- 9. Servlet Hello World错误 - 根本原因:java.lang.ClassNotFoundException:
- 10. 如何在线程“main”中找到异常的原因java.lang.StackOverflowError
- 11. EJB异常的根本原因。任何聪明的方法?
- 12. “无效的对象名称:dbo.etc”错误的根本原因?
- 13. Azure Active Directory Auth Broken - 没有已知的根本原因
- 14. Tomcat没有显示初始化失败的根本原因
- 15. 如何在SoapUI中找到连接重置的根本原因
- 16. 如何查看UmbrellaException的完整statcktrace(或根本原因)?
- 17. 无法找到TabBar上随机崩溃的根本原因
- 18. org.hibernate.exception.GenericJDBCException:无法执行含有根本原因的查询]
- 19. 重定向循环。无法进入的根本原因
- 20. 什么是android.graphics.Path.finalize()在10秒后超时的根本原因
- 21. Spring Roo“撤消创建”/“撤消管理”的根本原因?
- 22. valgrind能否报告读取uninit var的根本原因?
- 23. 检测java中堆转储的根本原因
- 24. ConfigInstall操作失败的根本原因是什么?
- 25. 如何找到GWT排列的根本原因
- 26. 需要知道“OutOfMemoryError:Java堆空间”的根本原因
- 27. 本原根问题
- 28. 什么原因导致“java.lang.IncompatibleClassChangeError:vtable存根”?
- 29. org.hibernate.exception.GenericJDBCException:无法打开连接]与根本原因java.sql.SQLException:
- 30. Java.lang.verifyerror我该如何解决甚至找出根本原因?
粘贴代码.. – Kick
默认大小由VM设置,但您可以使用-Xss JVM参数设置大小。 –