0

我有以下循环来侦听传入的 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

4 回答 4

5

你的 while 循环每 500 次迭代,你就会回调run.

run()
.
. 500 iterations
.
   run()
   .
   .
   . 500 iterations
   .
      run()

你的loopRecv布尔值没有做任何事情。尽管您设置loopRecv为 false,但您会立即进行递归调用,从而使布尔赋值变得无用!因此,StackOverflowError. 相反,您为什么不找到一种方法来迭代地实现您的方法呢?考虑打破标签。目前还不清楚您的功能完成了什么。

于 2013-06-21T21:34:58.397 回答
0

常见的 StackOverFolow 错误带有一个无限递归循环,该循环没有终端并连续调用自身,在您的情况下,run ()即使在条件为 true 之后也调用,因此如果您在 while 循环中声明断点,您将不会收到错误.

我有兴趣问你为什么run ()在条件为真后打电话?是有趣的问题还是你有什么目的?

于 2013-06-21T21:39:24.727 回答
0

您每次 count == 500 时都会递归调用该方法。这会减慢 StackOverflowError 的速度,但它仍然会发生。

从 while 循环内部删除对 run() 的调用,它不应该再出错了。

于 2013-06-21T21:35:25.670 回答
0

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

于 2013-08-22T17:25:36.953 回答