相关文章推荐
温暖的弓箭  ·  南漳县武安镇人大用“四个一批”确保共同缔造走深走实·  9 月前    · 
性感的炒饭  ·  “对话职场”活动解析行业研究与机构销售·  1 年前    · 
侠义非凡的吐司  ·  使用ElasticSearch ...·  1 年前    · 
活泼的柚子  ·  第三届全国中世纪哲学论坛在浙江大学成功举办— ...·  1 年前    · 
魁梧的小刀  ·  摘錄李智平助理教授講授的議論文寫作要領,談及 ...·  1 年前    · 
小百科  ›  一文优化java.lang.StackOverflowError的堆栈滤问题及演算引发的java.lang.StackOverflowError错误-天翼云
递归 递归调用 天翼云 天翼
率性的爆米花
1 年前

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
查看全部活动
热门活动
  • 818·全民上云季 NEW 2核2G云主机只要47.4元/3个月起
  • 算力套餐 NEW 让算力触手可及
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 中小企业上云场景组合购 NEW 建站、域名等场景一站式购齐,组合购9元起!
  • 天翼云·创新直播间 NEW 与专家共同解读云计算领域前沿趋势
  • 新客特惠 NEW 全场热销云主机2.5折!
  • 天翼云电脑专场 HOT 移动办公神器天翼云电脑4核8G畅享3个月只要130元起!
  • 云主机特惠 HOT 多款云主机新老同享,满足您的上云需求!
免费活动
  • 企业免费试用专区 HOT 数十款产品免费试用,完成企业实名认证领取2000元试用金!
  • 个人免费试用专区 HOT 完成个人实名认证即可获得1000元试用金!
  • 新客特惠 全场云主机2.5折起
  • 云上安全专场 安全产品全场6折起!

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务。
进入甄选商城 进入云市场
办公协同
  • WPS云文档天翼云版 翼企云( License版) 天翼云企业云盘(标准服务版) 蓝信安全移动工作平台(SAAS) SSL证书 新域名服务 税务风控云 商企云财税(SAAS版) 翼云加速-标准版包月套餐 天翼云管家2.0 天翼云管家 翼备份(SaaS版)300G 智慧工厂_生产流程管理解决方案 天翼智慧工地 天翼全栈混合云敏捷版(软件) 天翼全栈混合云敏捷版(一体机)

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云技术合作伙伴
  • 天翼云OpenAPI中心 天翼云诸葛AI平台 天翼云EasyCoding平台
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云培训认证
  • 天翼云学堂 天翼云市场商学院
天翼云服务合作伙伴
  • 天翼云MSP合作伙伴
天翼云合作计划
  • 央企云合作计划
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴 天翼云甄选商城合作伙伴

开发者

开发者相关功能入口汇聚
技术社区
资源与工具
  • 天翼云OpenAPI EasyCoding敏捷开发平台 AI创作间
培训与认证
  • 天翼云学堂 天翼云认证

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • OpenAPI中心 客户支持计划

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云 天翼云4.0 天翼云APP 全球基础设施 分析师和白皮书 2023云生态大会 2022云生态大会 天翼云中国行 支持与服务 了解天翼云
  • 站点切换
    • 中国站
  • 文档
  • 控制中心
  • 备案
  • 管理中心

一文优化java.lang.StackOverflowError的堆栈溢出问题及递归引发的java.lang.StackOverflowError错误

首页 知识中心 其他 文章详情页

一文优化java.lang.StackOverflowError的堆栈溢出问题及递归引发的java.lang.StackOverflowError错误

2023-07-28 07:36:03 阅读次数:8

java, 调用, 递归

1. 问题引出

今天在编码时,出现了 java.lang.StackOverflowError ,就感觉很莫名其妙。

由于源代码涉及到公司业务,暂无法公开到博客上,望读者见谅。

但为了复现 StackOverflowError 的错误,我特地编写如下代码来模拟:

* 使用junit注解来调用testDegression方法 * @author super先生 * @datetime 2023/2/15 20:41 @Test public void testStackOverFlow ( ) { testDegression ( 100000 ) ; * 使用递归来模拟StackOverflowError * 栈帧不断增加累积,栈的深度直到超出JVM所允许的深度 * @param param 整数原始值 * @author super先生 * @datetime 2023/2/15 20:40 private void testDegression ( int param ) { param -- ; //递归,结束条件 if ( param == 0 ) { return ; testDegression ( param ) ;

该代码报出的如下图错误:

由上图可以看到, testDegression 一直在调用自己,也就是递归,从而导致栈溢出。

为什么 递归调用 会报出这个错误( java.lang.StackOverflowError )呢?

2. 分析问题

此时,正赶上 ChatGPT ,我们不妨让 ChatGPT 解释这个错误( java.lang.StackOverflowError ),解释结果如下图所示:

java.lang.StackOverflowError

StackOverflowError is a type of error that occurs when a program performs too many recursive calls, leading to an overflow of the call stack. This type of error is most commonly seen when a programming language does not terminate a recursive call, or when a programmer creates an infinite loop or recursive call. StackOverflowError can also be caused by an array being too large or an application attempting to allocate more memory than is available.

芭比Q了,解释结果是一段英文,不妨使用谷歌将其翻译成中文,如下所示:

java.lang.StackOverflowError

stackoverflowerror 是一种错误,当程序执行太多递归调用时,会导致堆栈的溢出。当编程语言未终止递归调用,或者程序员创建无限循环或递归调用时,这种错误最常见。

stackoverflowerror 也可能是由于数组太大或试图分配比可用的更多内存的应用程序引起的。

根据中文翻译可以知道,产生堆栈溢出( StackOverflowError )的原因有两个:

递归调用,这是最常见的错误

数组太大或分配内存比可用内存多

2.1 为什么递归调用会导致堆栈溢出

在计算机中,函数调用是通过栈 (stack) 这种数据结构实现的,每当程序执行进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。

由于栈的大小不是无限的,所以,递归调用的次数过多,就会导致栈溢出。

函数的参数是通过 stack 栈来传递的,在调用中会占用线程的栈资源。

递归调用在到达最后的结束点后,函数才能依次退栈清栈,如果递归调用层数过多,就可能导致占用的栈资源超过线程的最大值,从而导致栈溢出,程序异常退出。

2.2 数组太大或分配内存多于可用内存导致堆栈异常

存到栈上的主要内容是:

函数调用的函数环境,包括函数参数等。

假设局部变量 buff 为 1M ,如下代码所示:

char buff[1024*1024]

而你的栈默认也是1M大小,这就会发生栈溢出。

因为其他东西会占掉少量栈空间,局部变量能用的空间肯定小于1M,程序在执行到main函数之前,就会跳出stack overflow异常。

3. 优化避免栈溢出

当栈不够使用时,一种办法是修改程序:

主要还是要注意递归调用引起的栈溢出,多数情况可以通过算法优化来解决:

控制递归深度。例如,使用动态规划来代替递归算法等。

修改栈的大小。

3.1 尾递归优化

尾递归是指在函数返回的时候,调用函数本身,并且return语句不能包含表达式。

如果递归调用,都出现在函数的末尾,这个递归函数就是尾递归的函数。

尾递归函数的特点是在回归过程中,不用做操作,这个特性很重要,因为大多数现代编译器会利用这一特点,自动生成优化的代码。

有些语言极力提倡尾递归,因为它们的编译器会对代码进行优化,不会因为递归次数的增加,给函数栈带来巨大的开销。

尾递归优化,使无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。

递归的优点是逻辑清晰。

3.2 循环替代递归

所有的递归都可以改写成循环的方式。

斐波那契数列: 1,1,2,3,5,…

求斐波那契数列的第N项的值

尾递归和循环的执行效率都非常高。

但是尾递归的递归层数大到一定程度会出现段错误。

尾递归的函数栈开销比普通递归要小的多,执行效率大很多。

但是尾递归仍然有函数栈开销。

正因为尾递归具有函数栈开销,其调用次数比循环小很多。

使用如下三种方式(一般递归,尾递归,循环取代递归),来实现实现一个斐波那契数列,能不用递归就别用递归,能用尾递归就用尾递归。

  • 使用一般递归
  • int fib_normal(int n)
        if (n <= 2)
            return 1;
            return fib_normal(n-1) + fib_normal(n-2);
    
    int fib_rail(int n, int first,  int second)
        if (n == 1) return first;
        if (n == 2) return second;
        return fib_rail(n-1, second, second+first);
    unsigned int fib_rail_rec(unsigned int n)
        return fib_rail_rec(n, 1, 1);
    
  • 循环取代递归
  • int fib_no(
    
    
    
    
        
    int n)
        if (n <= 2)
            return 1;
        int x=1, y=1, y_tmp=0;
        for (int i=0; i<n-2; i++)
            y_tmp = y;
            y = x+y;
            x = y_tmp;
        return y;
    
    版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.csdn.net/lvoelife/article/details/128997917,作者:互联网全栈开发实战,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

    上一篇: Content type ‘application/x-www-form-urlencoded;charset=UTF-8‘ not supported错误的多种解决方法及说明Content-Type

    下一篇: SSL certificate problem: self signed certificate in certificate chain错误的全网详细解决方法

    相关文章

    2023-08-09 07:17:16

    Java学习Set之HashSet集合保证元素唯一性源码分析

    Java学习Set之HashSet集合保证元素唯一性源码分析

    2023-08-09 07:17:07

    使用datart连接hive报org.apache.thrift.transport.TTransport

    报错Caused by: java.lang.ClassNotFoundException: org.apache.thrift.transport.TTransport报错原因是因为我只加了hive-jdbc的包,无所加载到其他的类解决方

    apache
    2023-08-09 07:17:07

    kerberos开启后服务报错Unable to obtain password from user

    异常日志原因及解决办法错误提示是认证时不能获取密码。原因是手动生成的keytab文件其owner是root,应该改成对应组件的系统用户解决方案

    apache hadoop
    2023-08-09 07:17:07

    跨集群distcp数据的时候报错异常java.nio.channels.UnresolvedAddressException

    异常解决方案:(异常的原因是因为跨集群的时候无法解析跨集群的namenode的主机导致的)需要把两个集群的hosts合并重新distcp后数据正常

    apache hadoop
    2023-08-09 07:15:36

    H2 数据库的 expected “identifier 错误

    H2 数据库的 expected “identifier 错误

    2023-08-09 06:48:08

    定时任务@Scheduled 和 异步@Async

    定时任务@Scheduled 和 异步@Async

    2023-08-09 06:47:58

    IDEA配置热部署Devtools(微服务开发必备)

    IDEA配置热部署Devtools(微服务开发必备)

    2023-08-09 06:47:58

    Java8 Stream,常用方法大合集

    Java8 Stream,常用方法大合集

    System
    2023-08-09 06:47:58

    Dubbo及Zookeeper安装

    Dubbo及Zookeeper安装

    zookeeper
    2023-08-09 06:47:35

    Lombok @Slf4j 使用和配置

    pom依赖 resources下logback.xml配置,也可通过application.properties进行日志配置 在需要使用日志的类上加@Slf4j 注解 log.info(“logind

    spring

    作者介绍

    天翼云小翼
    天翼云用户

    文章

    20373

    阅读量

    1140217

    查看更多

    最新文章

    使用datart连接hive报org.apache.thrift.transport.TTransport

    2023-08-09 07:17:07

    kerberos开启后服务报错Unable to obtain password from user

    2023-08-09 07:17:07

    Dubbo及Zookeeper安装

    2023-08-09 06:47:58

    JAVA深层拷贝 - DeepCopy

    2023-08-07 07:24:54

    设计模式-------------静态/动态代理模式(结构型设计模式)

    2023-08-04 08:03:01

    python递归使用

    2023-08-04 07:30:01

    查看更多

    热门文章

    GC是什么? 为什么要有GC?

    2023-05-10 06:02:16

    在java正则表达式中为什么要对 . 进行两次的转义操作 (\\.)才表示真正的 .

    2023-05-15 10:01:56

    axios&spring前后端分离传参规范总结

    2023-05-22 08:09:06

    Jsp Ajax之模拟用户注册

    2022-11-17 12:37:24

    定义一个函数,接收三个参数返回一元二次方程

    2023-02-13 07:59:59

    IDEA报错 java: 错误: 不支持发行版本 5

    2023-04-17 10:54:25

    查看更多

    热门标签

    linux python Linux docker javascript spring kubernetes shell elasticsearch leetcode
    查看更多

    相关产品

    弹性云主机

    随时自助获取、弹性伸缩的云服务器资源

    天翼云电脑(公众版)

    便捷、安全、高效的云电脑服务

    对象存储

    高品质、低成本的云上存储服务

    云硬盘

    为云上计算资源提供持久性块存储

    查看更多

    随机文章

    python学习——递归函数

    elasticsearch启动异常

    分支语句复习 java

    JUC概述

    ShardingSphere实现读写分离

    IDEA Maven 依赖冲突解决神器Maven Helper使用示范

    推荐助力领好礼 邀请好友完成推荐任务 最高可得千元电信卡
    查看详情
    • 7*24小时售后
    • 无忧退款
    • 免费备案
    • 专家服务
    售前咨询热线
    400-810-9889转1
    • 天翼云APP 微信公众号
    服务与支持
    • 备案中心
    • 售前咨询
    • 智能客服
    • 自助服务
    • 工单管理
    • 客户公告
    账户管理
    • 管理中心
    • 订单管理
    • 余额管理
    • 发票管理
    • 充值汇款
    • 续费管理
    快速入口
    • 文档中心
    • 最新活动
    • 免费试用
    • 安全专区
    • 信任中心
    • 天翼云学堂
    云网生态
    • 甄选商城
    • 渠道合作
    • 云市场合作
    了解天翼云
    • 关于天翼云
    • 天翼云APP
    • 服务案例
    • 新闻资讯
    • 联系我们
    • 校园招聘
    热门产品
    • 弹性云主机
    • 边缘安全加速平台
    • 天翼云电脑
    • 天翼云手机
    • 关系型数据库
    • 对象存储
    • 云硬盘
    • Web应用防火墙
    • 服务器安全卫士
    • 天翼云办公
    热门推荐
    • 云服务备份
    • 云空间
    • 全站加速
    • 安全加速
    • 云服务器
    • 云主机
    • 智能边缘云
    • 应用编排服务
    • 微服务引擎
    • 共享流量包
    更多推荐
    • web应用防火墙
    • 密钥管理
    • 等保咨询
    • 安全专区
    • 应用运维管理
    • 云日志服务
    • 云网融合
    • 云搜索服务
    • 数据湖探索
    • 数据仓库服务
    友情链接
    • 天翼云盘
    • 天翼企业云盘
    • 189邮箱
    • 中国电信集团
    ©2023 京ICP备 2021034386号
     
    推荐文章
    温暖的弓箭  ·  南漳县武安镇人大用“四个一批”确保共同缔造走深走实
    9 月前
    性感的炒饭  ·  “对话职场”活动解析行业研究与机构销售
    1 年前
    侠义非凡的吐司  ·  使用ElasticSearch 和Transformers 实现语义搜索- 知乎
    1 年前
    活泼的柚子  ·  第三届全国中世纪哲学论坛在浙江大学成功举办——探讨跨文化视域 ...
    1 年前
    魁梧的小刀  ·  摘錄李智平助理教授講授的議論文寫作要領,談及書寫形式以及證據 ...
    1 年前
    今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
    删除内容请联系邮箱 2879853325@qq.com
    小百科 - 百科知识指南
    © 2024 ~ 沪ICP备11025650号