java栈溢出解决方法 java递归改为循环后为什么不会导致栈内存溢出?
java递归改为循环后为什么不会导致栈内存溢出?
我们知道,在编程中如果想让某个业务重复执行,一般有两种实现方式,分别是:递归和循环。在实际编码过程中,我们并不建议使用递归,反而是建议使用循环,这是为什么呢?
递归不当会导致内存溢出
其实不单单是Java,任何一款编程语言,如果递归写法不对,那就可能导致内存溢出!
学过Java的朋友肯定或多或少都听说和了解过栈内存和堆内存,程序在运行时,电脑操作系统会给每个进程都分配有堆内存、栈内存,所分配的堆栈内存都是有上限的,一旦超过了这个上限就会导致内存溢出现象。
为什么递归操作容易导致内存溢出呢?原因主要有以下几点:
递归方法体内,如果终止递归的条件写错了,那可能会导致无限递归,最终导致内存溢出;
即使递归方法及退出递归条件都是正常的,但若递归深度过深(递归次数过多),也会导致栈内存溢出!因为栈的出入规则是先入后出(先入栈的最后再出来),如果递归次数过多就会导致只入栈不出栈,最终栈内存溢出。
递归改循环可以降低内存溢出的可能
注意,递归写法改成循环写法可以降低内存溢出的风险,但这不是绝对的,如果循环写成了死循环一样会导致内存溢出。
递归写法改成循环写法的好处是,不会在短时间内出现栈的只入不出现象,所以可以规避栈内存溢出现象。
java中while(true)死循环会造成JVM内存溢出吗?
1、把局部变量定义在死循环里面会造成栈溢出,诸如下面的定义:
while(true){
int x=1;
int arr[]= new int[10];
}
因为栈空间存储局部变量、参数等对象,栈是有默认深度的,我记得是128M(记忆问题,错了请指出)。
2、把对象定义在起循环里面会产生堆内存溢出,诸如下列定义:
while(true){
Person p = new Person()
}
对象的生成是占时间和空间的,因为你的内存空间有限,早晚会产生堆空间内存溢出。
所以大家写代码要养成良好习惯,不在特殊情况下,不要把局部变量和对象定义在循环里面。
java栈内存溢出怎么产生?
栈溢出有两种,一种是stackoverflow,另一种是outofmemory,前者一般是因为方法递归没终止条件,后者一般是方法中线程启动过多。
java栈溢出解决方法 java栈溢出的原因 递归导致栈溢出的解决办法
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。