我读到了无限循环,并发现在某些语言中它会在堆栈溢出或达到分配的最大内存时停止。其他人将永远循环,具体取决于程序和语言的类型。 我的问题是,java无限循环停止吗?我只是好奇,因为java有一个垃圾收集器,当有内存泄漏时,如果达到分配的最大内存和堆栈溢出,则重用内存。
此外,这种无限循环会停止吗?
for( ; ; ){}
答案 0 :(得分:7)
我的问题是,java无限循环会停止吗?
有些人有,有些则没有。这取决于循环的实现方式。
基本上,您确定在其他语言中停止的情况也可以在Java中停止...取决于您如何编码它们。
通过无限递归实现的循环将发生堆栈溢出。这在Java中比在某些语言中更容易“实现”。 (无尾调用优化。)
如果循环重复分配仍然可以访问的对象,则会发生堆溢出...因此GC无法回收它们。
(看似无限循环可以通过各种其他方式终止。)
我只是好奇,因为java有一个垃圾收集器,当内存泄漏时,如果达到分配的最大内存和堆栈溢出,则重用内存。
垃圾收集器回收无法访问的对象,但无法回收可访问的对象(即将来
垃圾收集器不处理堆栈内存,因此它与堆栈溢出失败无关。
此外,这种无限循环会停止吗?
没有
严格来说,任何循环都不是无限的,如果它因任何原因停止......这包括堆栈溢出或内存耗尽等原因。
但即使是无限循环也不是真正的无限。最终用户将杀死循环程序,电源将失败,硬件将被废弃......或类似的东西。
答案 1 :(得分:3)
无限循环不停止,没有其他原因导致整个事情崩溃: - )
这通常是资源短缺,无论是在无限递归,还是内存不足的情况下堆栈空间,因为你在循环中分配了一些(而不是释放它)。 / p>
垃圾收集只会丢弃垃圾。如果你的变量仍然可以访问内存,那么内存不会被视为垃圾。
换句话说,如果你的无限循环每次都在链表的末尾添加一个元素(并且你不会失去对头部的访问权限),那些节点的 none 将是垃圾收集,你最终会耗尽内存。
你的特定循环:
for (;;) {}
实际上不会停止,因为它没有使用任何资源。当然,您可以终止该进程,或者您可能有一个使用资源的单独线程。这些(和其他事件)都可能导致循环停止,但它们都不在该循环的控制范围内。
答案 2 :(得分:2)
如果内存在循环中增长,则无限循环可能因内存而停止。在这种情况下,没有内存增长。
但是,如果你在循环的每次迭代中创建一些新的重物,那么它最终会因内存限制异常而停止。