带有周期性中断的java while循环接收内存不足异常

时间:2013-06-21 21:31:42

标签: 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.println("break from loop");

                    count = 0;


                }
            }
 }

问题是在几个小时内,我收到了内存不足异常。此外,我正在监控Top中的内存并且它正在缓慢增长。

我认为从这个循环中断会删除分配的堆栈帧,但似乎并非如此。

如何在不收到内存不足错误的情况下运行此循环?

4 个答案:

答案 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)

问题是我在运行之前打开了一个数据库连接而没有关闭它。