栈溢出怎么办
来源:互联网 发布:淘宝在线云客服入口 编辑:程序博客网 时间:2024/05/24 22:44
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 ,引用必须注明出处!
- 栈溢出怎么办
- VC中栈溢出/Stack overflow怎么办?
- C运算溢出怎么办?
- tomcat 内存溢出怎么办
- Android 加载大图片时内存溢出怎么办
- java运行时出现内存溢出怎么办
- 数据溢出怎么办,别慌别慌,try_catch来帮忙
- 堆溢出,栈溢出
- 堆溢出、栈溢出
- 栈溢出
- 栈溢出
- 栈溢出
- 栈溢出
- 栈溢出
- 栈溢出
- 栈溢出
- 栈溢出
- 栈溢出
- 博晨技术CEO张健:莫因ICO误伤区块链
- 一些关于函数与变量的预处理和执行的事
- Java代理方式——静态代理和动态代理详解
- IntelliJ Idea 2017 注册码 免费激活方法
- Jetson TX1uboot编译与烧写
- 栈溢出怎么办
- SpringMVC Controller 原理简介
- Java关于数据结构的实现:树
- 区块链,下一波Fintech浪潮
- 钽电容容量、耐压与封装关系
- 每日区块链:区块链需求增加,Nvidia有望获得巨额利润;澳洲大学建立世界首家区块链社会科学研究中心
- 区块链技术如何改变安全行业
- 每日区块链:芬兰:区块链将开启难民的金融生活;美国政府拨款10万美元,将区块链技术用于公共图书馆系统
- Kim Jackson担任SingularDTV娱乐部门总裁,展开区块链与传统内容规划