我有以下循环侦听
中的UDP消息 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;
}
}
}
问题是在几个小时内,我收到了内存不足异常。此外,我正在监控Top中的内存并且它正在缓慢增长。
我认为从这个循环中断会删除分配的堆栈帧,但似乎并非如此。
如何在不收到内存不足错误的情况下运行此循环?
答案 0 :(得分:5)
while循环的每500次迭代,您回调到run
。
run()
.
. 500 iterations
.
run()
.
.
. 500 iterations
.
run()
您的loopRecv
布尔值没有做任何事情。虽然你将loopRecv
设置为false,但是你立即进行递归调用,使得布尔赋值无效!因此,StackOverflowError
。相反,为什么不只是找到一种迭代实现方法的方法呢?考虑打破label。目前还不是很清楚你的功能是什么。
答案 1 :(得分:0)
每次count == 500时都会递归调用该方法。这会降低StackOverflowError的速度,但它仍会发生。
从while循环内部删除对run()的调用,它不应再出错了。
答案 2 :(得分:0)
常见的StackOverFolow错误带有一个无限递归循环,它没有终端并且在你的情况下连续调用你的调用run ()
,即使条件为真,所以如果你声明了一个断点,那么循环你不会得到错误。
我有兴趣询问为什么在条件成立后你打电话给run ()
?这是有趣的事情还是你有目的?
答案 3 :(得分:0)
问题是我在运行之前打开了一个数据库连接而没有关闭它。