在写一个算法中,由于递归调用次数过多,堆栈溢出。

堆栈的大小是系统控制的,无法改变。

如果递归调用出现问题,可以考虑采取循环的方式来解决,将需要的数据在关键的调用点保存下来使用。简单的说,就是用自己的数据保存方法来代替系统递归调用产生的堆栈数据。

溢出的意思就是越界,操作系统会给每个进程分配一个最大上限的堆栈空间,如果超过了这个内存空间大小程序就会coredump,就像你创建一个太大的数组会崩溃一样,因为这里堆溢出了。操作系统分配给一个进程的栈空间是2M,堆空间在32位机器上是4G。如果你的进程的栈空间使用超过了2M就会栈溢出,堆使用超过4G就会堆溢出。

那么递归为什么会导致栈溢出呢?相信大家知道栈的出入规则,就像一个瓶子,方法压栈运行,先进后出,递归的话那么先入的不能出栈,会存在栈空间中,这样就容易导致栈满而溢出。

每当你调用一个方法,在这个方法执行前都会将之前的内存地址(也就是调用点)入栈,等被调用的方法执行完将地址出栈,程序根据这个数据返回调用点。

若递归调用次数太多,就会只入栈不出栈,于是堆栈就被压爆了,此为栈溢出。

递归函数调用的太深,需要太多的内存,递归里用到的局部变量存储在堆栈中,堆栈的访问效率高,速度快,但空间有限,递归太多变量需要一直入栈而不出栈,导致需要的内存空间大于堆栈的空间。

视频解析:https://www.icourse163.org/learn/ZJU-93001?tid=1003013004#/learn/content?type=detail&id=1004242195&cid=1005239393&replay=true

如何利用循环代替递归以防止栈溢出

http://www.cnblogs.com/wb-DarkHorse/archive/2013/11/15/3284228.html

尾递归

http://www.cnblogs.com/JeffreyZhao/archive/2009/03/26/tail-recursion-and-continuation.html

http://www.cnblogs.com/JeffreyZhao/archive/2009/04/01/tail-recursion-explanation.html

java递归堆栈溢出_【java】递归次数过多导致堆栈溢出相关推荐

  1. java实现递归下降分析_使用递归实现检查未知层级目录中的文件-Java实用技能

    现在有这样一个需求,给你一个目录,需要你在此目录中查找全部名字中包含指定字符的文件. 这题的主要难点在于:目录中可能包含子目录,子目录中又会包含子目录.而我们事先没办法确定子目录到底有多少层!这时候就 ...

  2. 设置线程堆栈大小_哇擦,传说中的堆栈溢出和快速排序

    stack overflow 堆栈溢出和快速排序这两个概念对开发人员来说并不陌生,但是通知都只是听说过,真正开发过程中却很少会遇到.我也是敲代码好些行后非常有幸撞上了,而且还是两个一起出现的,这其中过 ...

  3. java堆外内存溢出_JVM 案例 - 堆外内存导致的溢出错误

    案例 一个网站为了实现客户端实时从服务端接收数据,使用了 CometD 1.1.1 作为服务端推送框架,服务器是 Jetty7.1.4,CPU i5,内存 4G,操作系统 32位Windows. 服务 ...

  4. java 内存泄露 书籍_[Java教程]一次艰难的内存泄露排查,BeanUtils 的锅

    [Java教程]一次艰难的内存泄露排查,BeanUtils 的锅 0 2020-10-29 18:24:42 现象 通过jstat -gcutil pid 5000 ,发现fgc次数很多而且频繁,此时 ...

  5. java 基础面试 英文_[Java面试] 面试java基础总结大全

    原标题:[Java面试] 面试java基础总结大全 基础知识: 1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. ...

  6. python递归 数字全排列_利用递归实现全排列(python)

    利用递归实现全排列(python) """ 利用递归实现全排列 第一个位置可能有n种可能,第二个位置可能 有n-1种可能...... 代码思路就是第一个位置可以和n个元素 ...

  7. java privatekey输出字符串_[Java教程]根据字符串(String)生成公钥(PublicKey)和私钥(PrivateKey)对象_星空网...

    根据字符串(String)生成公钥(PublicKey)和私钥(PrivateKey)对象 2012-05-29 0 1.字符串生成公钥对象 PublicKey /** * 实例化公钥 * * @re ...

  8. java视、频_[java视频]感人故 事视 频网 站上那找~~~

    感人故 事视 频网 站上那找~~~ 问题补充:感人故 事视 频网 站上那找~~~ ●呵呵,你问对人了,感人故事就去"新浪show",现在是新浪期下的网站,运行稳定,观看流畅,上传简 ...

  9. java 历遍 类_[Java] 遍历指定包名下所有的类(支持jar) | 学步园

    项目需要,仅做记录. 支持包名下的子包名遍历,并使用Annotation(内注)来过滤一些不必要的内部类,提高命中精度. 通过Thread.currentThread().getContextClas ...

最新文章

  1. docker pull下载镜像时的报错及其解决方法
  2. java system.runfinalization()_Android中缓存理解(一)
  3. spring教程极客学院,Mybatis-Plus学习总结(超详细整理
  4. 洛谷1527(bzoj2738)矩阵乘法——二维树状数组+整体二分
  5. 请问在allegro中如何在铜箔上单独放置过孔?
  6. 针对Parse error: syntax error, unexpected T_PUBLIC in D:报错提醒
  7. 虚拟磁盘没有可用的合格服务器,VMware提示:没有更多空间可供虚拟磁盘***.vmdk使用 所引发的故障及处理...
  8. Delphi 10.2.3发布
  9. 初学Phreeze 3
  10. 【博客话题】接触Linux 11年
  11. ACE_Reactor学习1 总体计划
  12. 提升专业素养之软件工程概述
  13. SWFUpload文件上传
  14. Linux系统启动流程
  15. php动态网页倒计时代码,js如何实现动态倒计时效果
  16. SteamVR自定义手部抓取姿势
  17. java基础 java面向对象,抽象类,接口,变量
  18. 2021 写博客指南·万字长文警告
  19. Android 仿应用宝下载进度条
  20. php 公众号 欢迎,关注公众号的欢迎语怎么设置?公众号欢迎语怎么加链接?

热门文章

  1. 电脑提示ISDone.dll错误怎么办?
  2. 大型开源车牌数据集CCPD及私有车牌数据集介绍
  3. CheatSheet——PCL
  4. excel数据表转成insert语句插入数据库
  5. CF869A The Artful Expedient 结论题+数论
  6. QCA7000/QCA7005基于全志V3S Linux系统驱动移植
  7. TLS1.3抓包分析(3)——EncryptedExtentions等
  8. 重头系统的学习,不会咱就学!2014.6.18
  9. MySQL数据库入门【最详细的入门教学】
  10. 我的性格分析和对未来职业的规划