美文网首页
递归调用太深,可能导致栈溢出

递归调用太深,可能导致栈溢出

作者: test_java | 来源:发表于2019-05-09 08:34 被阅读0次

    栈溢出原因:
    因为每调用一个方法就会在栈上创建一个栈帧,方法调用结束后就会弹出该栈帧,而栈的大小不是无限的,所以递归调用次数过多的话就会导致栈溢出。而递归调用的特点是每递归一次,就要创建一个新的栈帧,而且还要保留之前的环境(栈帧),直到遇到结束条件。所以递归调用一定要明确好结束条件,不要出现死循环,而且要避免栈太深。
    解决方法:

    1. 简单粗暴,不要使用递归,使用循环替代。缺点:代码逻辑不够清晰;
    2. 限制递归次数;
    3. 使用尾递归,尾递归是指在方法返回时只调用自己本身,且不能包含表达式。编译器或解释器会把尾递归做优化,使递归方法不论调用多少次,都只占用一个栈帧,所以不会出现栈溢出。然鹅,Java没有尾递归优化。

    当遇到递归时,可能出现栈空间不足,出现栈溢出,再申请资源扩大栈空间,如果空间还是不足会出现内存溢出oom。
    合理的设置栈空间大小;
    写递归方法注意判断层次;
    能用递归的地方大多数能改写成非递归方式。

    相关文章

      网友评论

          本文标题:递归调用太深,可能导致栈溢出

          本文链接:https://www.haomeiwen.com/subject/khrioqtx.html