-
如何计算方法递归调用多少次数不会导致StackOverflowError5
JVM中的栈大小可以通过参数Xss指定或使用默认值,写了一段代码:public class StackOOM { static int count = 0; public static int increment(int i){ count++; return increment(i); } public static void main(String[] args) { int begin = 0; try { increment(begin); } catch (Exception e) { }finally{ System.out.println(count); } } }
可以打印出在抛出java.lang.StackOverflowError时已经递归调用的次数?
我想知道如何从理论上计算可以递归调用的次数。
请高手们指教 谢谢2012年7月09日 16:33
2个答案 按时间排序 按投票排序
-
我说个思路吧,现在有点事情要处理,没办法上代码
在运行的时候可以通过
Runtime.getRuntime().totalMemory()和 Runtime.getRuntime().freeMemory()
获取运行时增长占用的内存
这里可能遇到gc的情况
在某个时间段(没有gc的时间段)可以统计出来
这段时间递归了多少次count,并增长的内存inc_mem
每次递归占用的内存recurise_per = inc_mem/count;
不过xss中有部分是初始化占用的内存设为 init_mem;
假设每次jvm初始化线程占用的内存均一样
第一次:xss64k
stackoverflow时 count1
第二次:xss128k
stackoverflow时 count2
那么有下面这个等式
(count1*recurise_per +x)*2=count2*recurise_per+x
x=(count2-count1)*recurise_per ;
total_loop=(64k-x)/recurise_per2012年7月09日 21:29
-
我执行结果都是12509,修改参数Xss没有作用。
个人觉得应该和每次入栈保存的变量个数、大小有关系。
上面例子就是整数i(4个字节),递归方法的指针大概也要有2个字节引用。
是不是把栈总大小除以每次入栈占用的大小就可以估算出来了。2012年7月09日 19:05
相关推荐
Java.lang.StackOverflowError是Java虚拟机(JVM)在执行程序时抛出的一种运行时错误,它表明程序中存在过深的递归调用或者方法调用栈溢出的情况。当方法调用的层次太深,超出了虚拟机栈的最大深度时,就会触发这个...
首先,深度递归调用是导致StackOverflowError的主要原因。在递归算法中,每次函数调用都会占用一定量的内存空间,当递归层次过深时,就会超出系统为程序分配的栈空间,从而引发StackOverflowError。因此,一个有效的...
以斐波那契数列的计算为例,递归方法会重复计算很多中间结果,导致栈溢出,而迭代方法只需使用几个变量就可以计算出结果,不再依赖于调用栈,有效避免了 StackOverflowError。 最后,需要注意的是,优化代码以减少...
在软件开发过程中,尤其是使用递归方法时,经常会遇到栈溢出(StackOverflowError)的问题。递归算法简洁易懂,但在某些情况下会因为递归深度过大而导致栈溢出。以下是几种处理此类问题的方法: 首先,一种有效的...
在编程中,尤其是在使用递归方法解决问题时,常常会遇到StackOverflowError错误。这个问题通常由于递归调用过深,导致程序栈空间耗尽而引发。为了解决这一问题,我们可以采取多种方法,这里介绍两种主要的解决方案。...
因此,需要注意递归的深度,避免因递归过深而导致栈溢出错误(StackOverflowError)。 - **递归效率**:对于一些问题,递归可能不是最优解,尤其是在没有考虑缓存中间结果的情况下(这被称为尾递归优化)。在这些...
其次是栈溢出问题,即递归调用过深可能导致`StackOverflowError`,因为Java虚拟机对调用栈的大小有限制。性能问题也是一个需要考虑的因素,因为每次递归调用都会增加新的方法调用,可能导致效率低下。 为了避免递归...
递归调用可能会造成 java.lang.StackOverflowError 即栈溢出和程序执行过慢的问题,因此需要谨慎使用递归调用。 知识点七:Java 递归调用实现树形菜单的效果 通过递归调用,可以实现理论上的获取无极限的子评论...
然而,它也有缺点,比如在处理特别长的链表时可能会导致栈溢出错误(StackOverflowError),因为每次函数调用都会消耗一定的栈空间。此外,如果链表中存在循环引用,递归方法可能会陷入无限递归。 对于实现递归函数...
- 递归深度过深可能导致栈溢出错误(StackOverflowError),因此需要合理设定终止条件。 - 递归可能导致内存占用增加,因为每次调用都需要存储局部变量和返回地址。 6. **优化递归**: - **尾递归**:如果递归...
在Java中,如果没有尾递归优化(如Haskell等语言支持),大量递归可能导致性能问题,甚至引发`StackOverflowError`异常。 相比之下,迭代通常使用循环结构(如`while`、`for`或`for-each`)来解决问题。迭代通常比...
Java程序在运行时,每个线程都会拥有一个私有的调用栈,用于存放局部变量和部分状态,当递归调用层数过大或方法调用层次过深,就可能会导致该线程的堆栈空间耗尽,从而引发StackOverflowError。解决此类异常,可以...
- **递归深度限制**:Java虚拟机(JVM)对递归深度有限制,过深的递归可能导致StackOverflowError。 - **尾递归优化**:某些编译器或解释器支持尾递归优化,可以避免因递归调用产生的额外开销,但Java标准版(JVM)...
方法递归是指一个方法自身调用自身。使用递归的时候,必须添加结束条件,没有结束条件,会发生栈内存溢出错误。StackOverflowError的原因是:一直压栈,没有弹栈,栈内存不够用。 在使用递归的时候,需要注意以下几...
当方法递归调用过深或者局部变量过多导致栈空间不足时,就会出现栈溢出。而如果线程私有的堆栈大小有限,大量线程同时运行时,可能会耗尽所有内存,引发内存溢出。 在实际编程中,合理设计方法的复杂度和调用深度,...
1. **无限递归**:如果没有正确设置基本情况,可能会导致无限递归,从而耗尽系统资源,最终引发StackOverflowError。 2. **效率问题**:递归通常比迭代(非递归)解决方案效率低,因为它涉及到更多的函数调用和堆栈...