首页 > 编程知识 正文

栈溢出简单实例(java 栈 堆 方法区)

时间:2023-05-06 08:49:24 阅读:75838 作者:3612

1、什么是堆栈溢出?

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

2、解决办法:

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

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

笑带:使用静态对象而不是非静态本地对象

在递归函数设计中,可以使用静态对象代替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 举报,一经查实,本站将立刻删除。