怎样解决栈溢出

怎样解决栈溢出

1,什么是栈溢出?

由于栈一般默觉得1-2m,一旦出现死循环或者是大量的递归调用,在不断的压栈过程中,造成栈容量超过1m而导致溢出。

2,解决方式:

方法一:用栈把递归转换成非递归

通常,一个函数在调用还有一个函数之前,要作例如以下的事情:a)将实在參数,返回地址等信息传递给被调用函数保存; b)为被调用函数的局部变量分配存储区;c)将控制转移到被调函数的入口. 从被调用函数返回调用函数之前,也要做三件事情:a)保存被调函数的计算结果;b)释放被调函数的数据区;c)按照被调函数保存的返回地址将控制转移到调用函数.全部的这些,不论是变量还是地址,本质上来说都是”数据”,都是保存在系统所分配的栈中的. 那么自己就能够写一个栈来存储必要的数据,以降低系统负担。

 

方法二:使用static对象替代nonstatic局部对象

在递归函数设计中,能够使用static对象替代nonstatic局部对象(即栈对象),这不仅能够降低每次递归调用和返回时产生和释放nonstatic对象的开销,并且static对象还能够保存递归调用的中间状态,并且可为各个调用层所訪问。

 

方法三:增大堆栈大小值

当创建一个线程的堆栈时,系统将会保留一个链接程序的/STACK开关指明的地址空间区域。可是,当调用CreateThread或_beginthreadex函数时,能够重载原先提交的内存数量。这两个函数都有一个參数,能够用来重载原先提交给堆栈的地址空间的内存数量。假设设定这个參数为0,那么系统将使用/STACK开关指明的已提交的堆栈大小值。后面将假定我们使用默认的堆栈大小值,即1MB的保留区域,每次提交一个页面的内存。

 

Java在创建线程时设置栈大小:thread(threadgroup group, runnable target, string name, long stacksize) 
         分配新的 thread 对象,以便将 target 作为其执行对象,将指定的 name 作为其名称,作为 group 所引用的线程组的一员,并具有指定的堆栈大小。

Java虚拟机的堆大小怎样设置:命令行

 java –Xms128m //JVM占用最小内存

–Xmx512m //JVM占用最大内存

–XX:PermSize=64m //最小堆大小

–XX:MaxPermSize=128m //最大堆大小

本文来自http://blog.csdn.net/luqiang454171826 ,引用必须注明出处!

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/119181.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 7、 正则化(Regularization)

    7、 正则化(Regularization)7.1过拟合的问题到现在为止,我们已经学习了几种不同的学习算法,包括线性回归和逻辑回归,它们能够有效地解决许多问题,但是当将它们应用到某些特定的机器学习应用时,会遇到过拟合(over-fittin

  • networkx之图遍历和图绘制

    networkx之图遍历和图绘制networkx之图遍历和图绘制文章目录networkx之图遍历和图绘制图数据读取后默认标签(labels)为索引,如何使用编号id?图数据读取后,如何得到节点集和边集?如何绘制多样的图?图数据读取后默认标签(labels)为索引,如何使用编号id?例如在读取football数据时,其labels都是节点的英文名称,这样在处理图数据时不是很方便,往往报错,我们通常习惯处理节点的编号从1开始,可以建立label-id的反向索引,如果处理图数据时只需要编号id,可以将labels属性设置为id,如果之后还

  • 创建KVM虚拟机_安卓kvm虚拟机

    创建KVM虚拟机_安卓kvm虚拟机可以用两种方法创建kvm虚拟机,一种是virt-manager管理工具创建,一种是命令行的方式。1.命令行方式创建kvm虚拟机。先创建qcow2格式的镜像文件,大小为20G。qemu-imgcreate-fqcow2/data/kvm/images/centos7.6×86.qcow20G输入命令进行虚拟机的安装:virt-install–name=centos7.6×86–vcpus=2–ram=2048–diskpath=/data/kvm/imag

    2022年10月26日
  • C++之内联函数

    C++继承C的一个重要特性是效率,在C中保护效率的一个方法是使用宏(macro),宏的实现是使用预处理器而不是编译器,预处理器直接用宏代码替换宏调用,所以就没有了参数压栈、生成汇编语言的CALL、返回

    2021年12月19日
  • Redis集群主从复制(一主两从)搭建配置教程【Windows环境】

    如何学会在合适的场景使用合适的技术方案,这值得思考。由于本地环境的使用,所以搭建一个本地的Redis集群,本篇讲解Redis主从复制集群的搭建,使用的平台是Windows,搭建的思路和Linux上基本一致! (精读阅读本篇可能花费您15分钟,略读需5分钟左右)Redis主从复制简单介绍为了使得集群在一部分节点下线或者无法与集群的大多数节点进行通讯的情况下, 仍然可以正常运…

  • 六大算法之动态规划_动态规划100题

    六大算法之动态规划_动态规划100题在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满足满足:nums1[i] == nums2[j]且绘制的直线不与任何其他连线(非水平线)相交。请注意,连线即使在端点也不能相交:每个数字只能属于一条连线。以这种方法绘制线条,并返回可以绘制的最大连线数。示例 1:输入:nums1 = [1,4,2], nums2 = [1,2,4]输出:2解释:可以画出两条不交叉的

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号