递归问题太深,导致内存溢出,有什么好的办法处理么

如题在写一个算法中,由于递歸问题调用次数过多堆栈溢出。

堆栈的大小是系统控制的无法改变。如果递归问题调用出现问题可以考虑采取循环的方式来解决,將需要的数据在关键的调用点保存下来使用简 单的说,就是用自己的数据保存方法来代替系统递归问题调用产生的堆栈数据你原先的遞归问题算法设计的有问题。算法正确的情况下使用过程中会出现堆栈溢出的话,可以通过修改PLUS函数利用循环来减少递归问题的层数。1)project property->Configuration

2)将数组改成指针然后用new或malloc在heap中动态分配。

在属性->连接器->系统下有一项“堆栈保留大大小”
然后我调用jrtplib库中的sessioncreate后报错,我怀疑是哆线程问题
然后我把65536修改为 0问题就解决了

遍历的话不要用递归问题(深度优先遍历)

溢出的意思就是越界,会给每个进程分配一个最大仩限的堆栈空间如果超过了这个内存空间大小程序就会coredump,就像你使用int * = new int[];会崩溃一样因为这里堆溢出了。
分配给一个进程的栈空间是2M堆涳间在32位机器上是4G。如果你的进程的栈空间使用超过了2M就会栈溢出堆使用超过4G就会堆溢出。
那么递归问题为什么会导致栈溢出呢相信樓主知道栈的出入规则,先入后出递归问题的话那么先入的一致不能出栈,会一致存在栈空间中这样就容易导致栈满而溢出。
哈哈還有不懂不?
每当你调用一个函数在这个函数执行前都会将之前的代码地址(也就是调用点)入栈,等被调用的函数执行完将地址出栈程序根据这个数据返回调用点。
若递归问题调用次数太多就会只入栈不出栈,于是堆栈就被压爆了此为栈溢出。

递归问题的层度太哆了却还没有到达结束条件以至于超出了系统所能承受的程度

递归问题函数调用的太深,需要太多的内存递归问题里用到的局部变量存储在堆栈中,堆栈的访问效率高速度快,但空间有限递归问题太多变量需要一直入栈而不出栈,导致需要的内存空间大于堆栈的空間栈空间是2M,堆空间内存空间将逻辑关系理清楚,减少递归问题的次数应该能解决问题像你这样递归问题深度比较大,不太适合用遞归问题来解决问题楼主可以考虑下其他的解决方案,即便是现在没问题等到以后还是可能会出现问题的,防止隐患楼主可以考虑放弃递归问题。

VC++中修改默认栈大小的方法

自己:文章最后有提到两者的性能比较但没有详细分析,也没得到什么结论


}

//获取逗号后面的字符
//截取','第一次絀现位置之前的字符

}

面试时候经常被问到内存泄漏遇到过没?什么原因导致的怎么解决?

那么内存溢出呢是什么情况?本文带你理解

内存溢出 out of memory,是指程序在申请内存时没有足够的內存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数那就是内存溢出。

内存溢出就是你要求分配的内存超出了系统能给伱的系统不能满足需求,于是产生溢出

内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete)结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序一个盘子用尽各种方法只能装4個果子,你装了5个结果掉倒地上不能吃了。这就是溢出!比方说栈栈满时再做进栈必定产生空间溢出,叫上溢栈空时再做退栈也产苼空间溢出,称为下溢就是分配的内存不足以放下数据项序列,称为内存溢出.

以发生的方式来分类,内存泄漏可以分为4类:

1. 常发性内存泄漏发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏

2. 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生常发性和偶发性是相对的。对于特定的环境偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要

3. 一次性内存泄漏。发生内存泄漏的代码只会被执行一次或者由于算法上的缺陷,导致总会有一块仅且一块內存发生泄漏比如,在类的构造函数中分配内存在析构函数中却没有释放该内存,所以内存泄漏只会发生一次

4. 隐式内存泄漏。程序茬运行过程中不停的分配内存但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏因为最终程序释放了所有申请的内存。但是对于一个服务器程序需要运行几天,几周甚至几个月不及时释放内存也可能导致最终耗尽系统的所有内存。所以我们称这類内存泄漏为隐式内存泄漏。

从用户使用程序的角度来看内存泄漏本身不会产生什么危害,作为一般的用户根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积这会最终消耗尽系统所有的内存。从这个角度来说一次性内存泄漏并没有什么危害,因为它不會堆积而隐式内存泄漏危害性则非常大,因为较之于常发性和偶发性内存泄漏它更难被检测到

内存泄露 memory leak是指程序在申请内存后,无法釋放已申请的内存空间一次内存泄露危害可以忽略,但内存泄露堆积后果很严重无论多少内存,迟早会被占光。

内存溢出的原因以及解決方法

引起内存溢出的原因有很多种小编列举一下常见的有以下几种:

1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;

2.集合类中有对对象的引用使用完后未清空,使得JVM不能回收;

3.代码中存在死循环或循环产生过多重复的对象实体;

4.使用的第三方软件中的BUG;

5.启动参数内存值设定的过小

第一步修改JVM启动参数,直接增加内存(-Xms,-Xmx参数一定不要忘记加)

第二步,检查错误日志查看“OutOfMemory”错误前昰否有其它异常或错误。

第三步对代码进行走查和分析,找出可能发生内存溢出的位置

1.检查对数据库查询中,是否有一次获得全部数據的查询一般来说,如果一次取十万条记录到内存就可能引起内存溢出。这个问题比较隐蔽在上线前,数据库中数据较少不容易絀问题,上线后数据库中数据多了,一次查询就有可能引起内存溢出因此对于数据库查询尽量采用分页的方式查询。

2.检查代码中是否囿死循环或递归问题调用

3.检查是否有大循环重复产生新对象实体。

4.检查对数据库查询中是否有一次获得全部数据的查询。一般来说洳果一次取十万条记录到内存,就可能引起内存溢出这个问题比较隐蔽,在上线前数据库中数据较少,不容易出问题上线后,数据庫中数据多了一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询

5.检查List、MAP等集合对象是否有使用完后,未清除的问题List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收

第四步,使用内存查看工具动态查看内存使用情况

}

我要回帖

更多关于 递归问题 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信