什么时候java无限循环停止?

时间:2013-09-18 01:03:21

标签: java algorithm loops for-loop garbage-collection

我读到了无限循环,并发现在某些语言中它会在堆栈溢出或达到分配的最大内存时停止。其他人将永远循环,具体取决于程序和语言的类型。 我的问题是,java无限循环停止吗?我只是好奇,因为java有一个垃圾收集器,当有内存泄漏时,如果达到分配的最大内存和堆栈溢出,则重用内存。

此外,这种无限循环会停止吗?

for( ; ; ){}

3 个答案:

答案 0 :(得分:7)

  

我的问题是,java无限循环会停止吗?

有些人有,有些则没有。这取决于循环的实现方式。

基本上,您确定在其他语言中停止的情况也可以在Java中停止...取决于您如何编码它们。

  • 通过无限递归实现的循环将发生堆栈溢出。这在Java中比在某些语言中更容易“实现”。 (无尾调用优化。)

  • 如果循环重复分配仍然可以访问的对象,则会发生堆溢出...因此GC无法回收它们。

看似无限循环可以通过各种其他方式终止。)

  

我只是好奇,因为java有一个垃圾收集器,当内存泄漏时,如果达到分配的最大内存和堆栈溢出,则重用内存。

垃圾收集器回收无法访问的对象,但无法回收可访问的对象(即将来

垃圾收集器不处理堆栈内存,因此它与堆栈溢出失败无关。

  

此外,这种无限循环会停止吗?

没有


严格来说,任何循环都不是无限的,如果它因任何原因停止......这包括堆栈溢出或内存耗尽等原因。

但即使是无限循环也不是真正的无限。最终用户将杀死循环程序,电源将失败,硬件将被废弃......或类似的东西。

答案 1 :(得分:3)

无限循环停止,没有其他原因导致整个事情崩溃: - )

这通常是资源短缺,无论是在无限递归,还是内存不足的情况下堆栈空间,因为你在循环中分配了一些(而不是释放它)。 / p>

垃圾收集只会丢弃垃圾。如果你的变量仍然可以访问内存,那么内存不会被视为垃圾。

换句话说,如果你的无限循环每次都在链表的末尾添加一个元素(并且你不会失去对头部的访问权限),那些节点的 none 将是垃圾收集,你最终会耗尽内存。

你的特定循环:

for (;;) {}

实际上不会停止,因为它没有使用任何资源。当然,您可以终止该进程,或者您可能有一个使用资源的单独线程。这些(和其他事件)都可能导致循环停止,但它们都不在该循环的控制范围内。

答案 2 :(得分:2)

如果内存在循环中增长,则无限循环可能因内存而停止。在这种情况下,没有内存增长。

但是,如果你在循环的每次迭代中创建一些新的重物,那么它最终会因内存限制异常而停止。