递归的深度

在使用递归的时候经常会抛出StackOverflowError,顾名思义就是栈满了,而我们这里所说的栈在java中通常就是虚拟机栈(vm stack),在每个方法执行的同时都会创建一个栈帧,用于存储局部变量表、操作数栈,动态链接,方法出口等信息,每一个方法从调用直到执行结束的过程就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。

虚拟机栈的深度是固定的,所以虚拟机栈中所装的栈帧的多少取决于栈帧的大小,而栈帧的大小就取决于

局部变量表、操作数栈,动态链接,方法出口四个的大小,而我们最熟悉的应该是局部变量表,用于存储方法中定义的局部变量的,因此局部变量越多栈所能装下的栈帧也就越少。写个程序验证一下:

//局部变量表大的方法

public void large(int a) {

try {

//使用随机数确保每一个字符串都不相同,效果更明显

String b = String.valueOf(100* Math.random());

String c = String.valueOf(100* Math.random());

String d = String.valueOf(100* Math.random());

String e = String.valueOf(100* Math.random());

String f = String.valueOf(100* Math.random());

String g = String.valueOf(100* Math.random());

a++;

large(a);

} catch (StackOverflowError error) {

System.out.println("large方法 " + a + " 层");

}

}

//局部变量表小的方法

public void small(int a) {

try {

a++;

small(a);

} catch (StackOverflowError error) {

System.out.println("small方法" + a + " 层");

}

}

分别运行large方法和small方法,运行结果如下:

从结果来看,差距还是挺明显的。

java 积累递归深度_java递归的深度相关推荐

  1. java 递归题目_Java 递归 常见24道题目 总结

    1.N个台阶的走法递归[这里设为10个台阶] /*** N个台阶的走法递归 * * 有个楼梯,台阶有10个,每次可以跳上1阶 或者 2阶 ,那么台阶的走法一共有多少种*/@Testpublic voi ...

  2. java 全盘搜索文件_java递归思想实现全盘搜索文件之高速版

    在上一篇文章中(JAVA递归思想实现全盘搜索文件系统之进阶版)我们借助递归思想和多线程提升了全盘搜索文件系统的速度, 但是通过测试,好像还是有点慢,有没有办法再快一点呢?通过短暂的探索,我发现是可以再 ...

  3. java多递归调用_java – 递归调用方法

    我无法绕过递归,更具体地说是我的教科书中提供的语法.它看起来像这样: public int sum (int num) { int result; if (num == 1) result =1; e ...

  4. java中的递归算法_java递归实现

    二话不说,先上代码 Java代码 publicclassTestRecursion{ //递归方法 publicstaticvoidfun(inti){ if(i >0){ i--; fun(i ...

  5. java arraylist 遍历树_Java递归遍历树形结构

    废话不多说了,直接给大家贴代码,具体代码如下所示://菜单树形结构 public JSONArray treeMenuList(JSONArray menuList, int parentId) { ...

  6. java全排列算法 递归算法_Java递归实现全排列

    最近整理之前自己学习Java时的一些代码笔记,可能都是一些比较基础的Java知识,在这里只是给需要的人参考一下. 递归算法:将数据分为两部分,递归将数据从左侧移右侧实现全排列 package inte ...

  7. java中的递归问题_java 递归问题

    递归和循环本质是都是多次执行,是可以互相替代的,只是递归是另外一种思想,你的代码是递归 但是,你的代码没办法完成的题目中说的结果,递归思想有问题,没有得出全部结果,一个长度为n的个字符不重复的字符串有 ...

  8. java引用类型有啥_Java引用类型原理深度剖析,看完文章,90%的人都收藏了

    Java中一共有4种引用类型(其实还有一些其他的引用类型比如FinalReference):强引用.软引用.弱引用.虚引用.其中强引用就是我们经常使用的Object a = new Object(); ...

  9. java 递归死循环_Java递归 - 感觉太煽情的个人空间 - OSCHINA - 中文开源技术交流社区...

    树节点类: package cn.com.tree; public class Node { private Integer id; private Integer parentId; private ...

最新文章

  1. Linux系统开发之路-中
  2. idea mybatis plus 代码生成插件_妙啊,Mybatis从浅入深-Plus(IDEA版通俗易懂)
  3. php7伪静态 源码,PHPWind 8.5和8.7版的伪静态.htaccess规则
  4. gtk linux 升级_需要在Ubuntu上更新GTK(10.04)
  5. 寒假每日一题(入门组)【week6 完结】
  6. 生成自签名ssl证书
  7. python图片解析库_python用来获得图片exif信息的库实例分析
  8. Linux Kernel ‘mp_get_count()’函数本地信息泄露漏洞
  9. SQL随机生成6位数字
  10. 为什么搞农旅项目那么多人失败?
  11. tomcat 原理与使用资料
  12. python零基础学习书-零基础学习python推荐几本书?
  13. [原创]独立模式安装Hive
  14. 用栈实现的算术表达式的运算
  15. python爬虫面试真题及答案_Python面试题爬虫篇(附答案)
  16. 系统架构设计笔记(91)—— 安全性规章
  17. Qt写的json代码生成器
  18. Python 数据相关性分析
  19. Iterative Deep Learning论文简读
  20. 预测模型介绍及预测与决策的联系

热门文章

  1. android 接入qq分享能力报错: java.lang.ClassNotFoundException: com.tencent.stat.StatConfig
  2. 自学JAVA基础 进阶版
  3. elementUI 表格表头合并行列后show-overflow-tooltip不生效问题
  4. 视频剪辑,如何批量将视频进行顺时针旋转90°
  5. java8/Stream流式计算从入门到精通/函数式编程实战
  6. fseek和ftell
  7. c语言先序遍历递归算法
  8. 不只有docker:可选择的容器化工具还有很多……
  9. java rx.observable_Rxjava2 Observable的数据变换详解及实例(一)
  10. c语言编程IP地址转换,用C语言将二进制转换为IP地址