首页 > 编程知识 正文

堆栈溢出怎么解决(递归栈溢出解决方法)

时间:2023-05-06 13:06:18 阅读:75839 作者:229

1、什么是堆栈溢出?

堆栈一般认为是1-2m,因此如果发生死循环或大量递归调用,堆栈重叠时堆栈容量会溢出超过1m。

2、解决办法:

方法1 :在堆栈中将递归转换为非递归

通常,在调用一个函数或另一个函数之前,例如,a )将实际参数、返回地址等信息传递给被调用方函数并存储; b )将存储区分配给被调用函数的局部变量; c )将控制转移到被调函数入口,在从被调函数返回调用函数之前,必须做三件事:a )保存被调函数的计算结果;b )释放被调函数的数据区域;c )根据被调函数保持的返回地址被调用函数控制所有这些,无论是变量还是地址,本质上都是“数据”,保存在系统分配的堆栈中。 这样,可以自己写堆栈存储必要的数据,减轻系统的负担。

无私柠檬:使用静态对象代替nonstatic本地对象

在递归函数设计中,可以使用静态对象代替nonstatic本地对象,也就是堆栈对象。 这不仅减少了每次递归调用和返回时生成和释放nonstatic对象的开销,而且使static对象能够保持递归调用的中间状态,并在各个调用级别进行访问。

方法3 :增加堆栈大小

创建线程堆栈时,将保留链接器的/STACK开关指定的地址空间空间。 但是,可以调用CreateThread或_beginthreadex函数来重新加载最初提交的内存数。 这两个函数都具有用于重新加载提交到堆栈的地址空间内存量的参数。 如果将此参数设置为0,则使用/STACK开关指定的提交堆栈大小值。 这里假设您使用默认的堆大小值,即1MB的保留空间,一次提交一页内存。

Java在创建线程时设置堆栈大小。 thread(threadgroupgroup,runnable target,字符串名称,长堆栈大小) )。

分配新的thread对象,使其以target为执行对象,以指定的name为名称,作为group引用的线程组的成员,并具有指定的堆栈大小。

如何设置Java虚拟机的堆大小:命令行

jvaXM s128 m//JVM占用最小内存

xmx 512 m///JVM占用最大内存

xx : permsize=64m//最小堆大小

xx : maxperm size=128 m///最大堆大小

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。