0 0

如何计算方法递归调用多少次数不会导致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个答案 按时间排序 按投票排序

0 0

我说个思路吧,现在有点事情要处理,没办法上代码

在运行的时候可以通过
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_per

2012年7月09日 21:29
0 0

我执行结果都是12509,修改参数Xss没有作用。
个人觉得应该和每次入栈保存的变量个数、大小有关系。
上面例子就是整数i(4个字节),递归方法的指针大概也要有2个字节引用。
是不是把栈总大小除以每次入栈占用的大小就可以估算出来了。

2012年7月09日 19:05

相关推荐

    java.lang.StackOverflowError(解决方案).md

    Java.lang.StackOverflowError是Java虚拟机(JVM)在执行程序时抛出的一种运行时错误,它表明程序中存在过深的递归调用或者方法调用栈溢出的情况。当方法调用的层次太深,超出了虚拟机栈的最大深度时,就会触发这个...

    StackOverflowError解决办法.md

    首先,深度递归调用是导致StackOverflowError的主要原因。在递归算法中,每次函数调用都会占用一定量的内存空间,当递归层次过深时,就会超出系统为程序分配的栈空间,从而引发StackOverflowError。因此,一个有效的...

    StackOverflowError(解决方案).md

    以斐波那契数列的计算为例,递归方法会重复计算很多中间结果,导致栈溢出,而迭代方法只需使用几个变量就可以计算出结果,不再依赖于调用栈,有效避免了 StackOverflowError。 最后,需要注意的是,优化代码以减少...

    StackOverflowError.md

    在软件开发过程中,尤其是使用递归方法时,经常会遇到栈溢出(StackOverflowError)的问题。递归算法简洁易懂,但在某些情况下会因为递归深度过大而导致栈溢出。以下是几种处理此类问题的方法: 首先,一种有效的...

    StackOverflowError如何解决.md

    在编程中,尤其是在使用递归方法解决问题时,常常会遇到StackOverflowError错误。这个问题通常由于递归调用过深,导致程序栈空间耗尽而引发。为了解决这一问题,我们可以采取多种方法,这里介绍两种主要的解决方案。...

    Java 零基础方法递归.md

    因此,需要注意递归的深度,避免因递归过深而导致栈溢出错误(StackOverflowError)。 - **递归效率**:对于一些问题,递归可能不是最优解,尤其是在没有考虑缓存中间结果的情况下(这被称为尾递归优化)。在这些...

    java递归教成.txt

    其次是栈溢出问题,即递归调用过深可能导致`StackOverflowError`,因为Java虚拟机对调用栈的大小有限制。性能问题也是一个需要考虑的因素,因为每次递归调用都会增加新的方法调用,可能导致效率低下。 为了避免递归...

    java利用递归调用实现树形菜单的样式

    递归调用可能会造成 java.lang.StackOverflowError 即栈溢出和程序执行过慢的问题,因此需要谨慎使用递归调用。 知识点七:Java 递归调用实现树形菜单的效果 通过递归调用,可以实现理论上的获取无极限的子评论...

    JAVA求链表长度的递归方法,这个想法是通过维护一个函数来使用递归

    然而,它也有缺点,比如在处理特别长的链表时可能会导致栈溢出错误(StackOverflowError),因为每次函数调用都会消耗一定的栈空间。此外,如果链表中存在循环引用,递归方法可能会陷入无限递归。 对于实现递归函数...

    day20_DiGui_sailuix_递归_

    - 递归深度过深可能导致栈溢出错误(StackOverflowError),因此需要合理设定终止条件。 - 递归可能导致内存占用增加,因为每次调用都需要存储局部变量和返回地址。 6. **优化递归**: - **尾递归**:如果递归...

    Java 递归和迭代的方法详解.pdf

    在Java中,如果没有尾递归优化(如Haskell等语言支持),大量递归可能导致性能问题,甚至引发`StackOverflowError`异常。 相比之下,迭代通常使用循环结构(如`while`、`for`或`for-each`)来解决问题。迭代通常比...

    堆栈溢出异常解决办法.md

    Java程序在运行时,每个线程都会拥有一个私有的调用栈,用于存放局部变量和部分状态,当递归调用层数过大或方法调用层次过深,就可能会导致该线程的堆栈空间耗尽,从而引发StackOverflowError。解决此类异常,可以...

    java递归算法实例分析

    - **递归深度限制**:Java虚拟机(JVM)对递归深度有限制,过深的递归可能导致StackOverflowError。 - **尾递归优化**:某些编译器或解释器支持尾递归优化,可以避免因递归调用产生的额外开销,但Java标准版(JVM)...

    2021Java零基础自学笔记资源(十一)方法重载

    方法递归是指一个方法自身调用自身。使用递归的时候,必须添加结束条件,没有结束条件,会发生栈内存溢出错误。StackOverflowError的原因是:一直压栈,没有弹栈,栈内存不够用。 在使用递归的时候,需要注意以下几...

    02.Java虚拟机栈1

    当方法递归调用过深或者局部变量过多导致栈空间不足时,就会出现栈溢出。而如果线程私有的堆栈大小有限,大量线程同时运行时,可能会耗尽所有内存,引发内存溢出。 在实际编程中,合理设计方法的复杂度和调用深度,...

    Recursion:我的第一个递归代码

    1. **无限递归**:如果没有正确设置基本情况,可能会导致无限递归,从而耗尽系统资源,最终引发StackOverflowError。 2. **效率问题**:递归通常比迭代(非递归)解决方案效率低,因为它涉及到更多的函数调用和堆栈...

Global site tag (gtag.js) - Google Analytics