【问题标题】:when do java infinite loops stop?java无限循环什么时候停止?
【发布时间】:2013-09-22 14:59:14
【问题描述】:

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

还有,这种无限循环会停止吗?

for( ; ; ){}

【问题讨论】:

  • 这永远不会停止,无限循环将停止的唯一时间是它正在泄漏内存或进行某种递归。希望其他人能给你一个更彻底的答案
  • 这个循环不会停止,因为它从一开始就永远不会开始。 Java的优化编译器会看到循环不起作用,没有副作用,并消除死代码。
  • 当时间用完时它们会停止 :) 或者进程被杀死。
  • @Andrew Bissell - 当我尝试这个时,Eclipse 和 JRE 在循环后都给了我一个关于无法访问代码的错误。如果循环之后没有代码,它仍然会执行并且永远不会超过它。
  • @AndrewBissell 好吧,如果你声明像boolean run = true 这样的变量并使用while(run) { } 它会通过,因为它可以被其他线程更改,但如果没有更改,你会得到一个无限循环.

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


【解决方案1】:

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

有些会,有些不会。这取决于循环是如何实现的。

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

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

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

(还有其他多种方式可以终止看似的无限循环。)

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

垃圾收集器回收无法访问的对象,但无法回收可访问的对象(即,可以在将来被程序使用)。

垃圾回收器不处理栈内存,因此与栈溢出故障无关。

还有,这种无限循环会停止吗?

没有。


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

但即使是无限循环也不是真正的无限。最终用户会杀死循环程序,电源会失效,硬件会报废......或类似的事情。

【讨论】:

  • 我认为没有人认为“无限循环”中的“无限”是数学上的无限。它更像是“一个没有任何有效限制的循环”。
  • @TedHopp - 我敢肯定有人会这么想。事实上,如果有些人发现这一点有点令人困惑......首先,我会感到惊讶。此外,很难定义“没有任何有效限制”的实际含义。因此,值得一提的是这些问题...... IMO。
【解决方案2】:

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

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

【讨论】:

  • 关于你的第二点:只有在对对象的硬引用也被维护的情况下才是正确的(即不要超出范围,所以重的对象不会变成垃圾)。
  • @TedHopp,对,换句话说,在循环范围之外的另一个对象中创建这些对象。
【解决方案3】:

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

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

垃圾收集只会丢弃垃圾。如果您的变量仍然可以访问内存,则不会将其视为垃圾。

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

你的那个特定循环:

for (;;) {}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 2018-11-03
    • 2021-10-21
    相关资源
    最近更新 更多