Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有周期中断的java while循环收到内存不足异常_Java_Loops_Memory Leaks_Out Of Memory_Infinite Loop - Fatal编程技术网

具有周期中断的java while循环收到内存不足异常

具有周期中断的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

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


                }
            }
 }
问题是在几个小时内,我收到一个内存不足的异常。我还在监控顶部的内存,它正在缓慢增长

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


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

每隔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
,因为它不是一个例外。