具有周期中断的java while循环收到内存不足异常
我有下面的循环来侦听传入的UDP消息具有周期中断的java while循环收到内存不足异常,java,loops,memory-leaks,out-of-memory,infinite-loop,Java,Loops,Memory Leaks,Out Of Memory,Infinite Loop,我有下面的循环来侦听传入的UDP消息 public void run(){ int count = 0; boolean loopRecv = true; while (loopRecv) { count++; if (count == 500) { loopRecv = false; System.out.prin
public void run(){
int count = 0;
boolean loopRecv = true;
while (loopRecv) {
count++;
if (count == 500) {
loopRecv = false;
System.out.println("break from loop");
count = 0;
}
}
}
问题是在几个小时内,我收到一个内存不足的异常。我还在监控顶部的内存,它正在缓慢增长
我以为从这个循环中中断会删除分配的堆栈帧,但事实似乎并非如此
如何在没有收到内存不足错误的情况下运行此循环?每隔500次while循环,您就会调用
run
run()
.
. 500 iterations
.
run()
.
.
. 500 iterations
.
run()
您的
loopRecv
boolean没有执行任何操作。尽管您将loopRecv
设置为false,但您会立即进行递归调用,从而使布尔赋值无效!因此,堆栈溢出错误
。相反,为什么不找到一种迭代实现方法呢?考虑一下分手吧。您的函数完成了什么还不是很清楚。在while循环中,每500次迭代,您就会调用run
run()
.
. 500 iterations
.
run()
.
.
. 500 iterations
.
run()
您的
loopRecv
boolean没有执行任何操作。尽管您将loopRecv
设置为false,但您会立即进行递归调用,从而使布尔赋值无效!因此,堆栈溢出错误
。相反,为什么不找到一种迭代实现方法呢?考虑一下分手吧。您的函数完成了什么还不是很清楚。每次count==500时,您都会递归调用该方法。这会减慢StackOverflower错误的速度,但它仍然会发生
从while循环内部删除对run()的调用,它将不再出错。每次count==500时,您都会递归调用该方法。这会减慢StackOverflower错误的速度,但它仍然会发生
从while循环内部删除对run()的调用,它就不会再出错。常见的StackOverFolow错误带有一个无限递归循环,该循环没有终端,并且不断地调用自己,在您的情况下,调用
run()
,即使在条件为真之后,因此,如果向while循环声明断点,则不会出现错误。我想问一下,为什么在条件为真后调用
run()
?这是一个有趣的问题还是你有什么目的?常见的StackOverFolow错误伴随着一个无限递归循环,它没有终端,并且不断地调用自己,在你的例子中,你的调用run()
,即使在条件为真之后,因此,如果向while循环声明断点,则不会出现错误。我想问一下,为什么在条件为真后调用
run()
?这是一个有趣的问题还是你有什么目的?问题是我在运行之前打开了一个数据库连接,但没有关闭它。问题是我在运行之前打开了一个数据库连接,但没有关闭它。从技术上讲,我认为你没有得到OutOfMemory错误。你是说堆栈溢出,对吗?@AmirAfghani是对的,你递归地称自己!你为什么这么做?可能有更好的方法来编写此代码。从技术上讲,我不认为您会出现OutOfMemory错误。你是说堆栈溢出,对吗?@AmirAfghani是对的,你递归地称自己!你为什么这么做?可能有更好的方法来编写此代码。您的意思是stackoverflowerr
,因为它不是一个例外。您的意思是stackoverflowerr
,因为它不是一个例外。