有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

算法java无限循环何时停止?

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

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

for( ; ; ){}

共 (2) 个答案

  1. # 1 楼答案

    My question is, do java infinite loops stop?

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

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

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

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

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

    I'm just curious because java has a garbage collector, that reuse memory when there's memory leak in case of reaching allotted maximum memory and stack overflow.

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

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

    Also,will this kind of infinite loop stop?

    没有


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

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

  2. # 2 楼答案

    无限循环不会停止,除非有其他原因导致整个过程崩溃:-)

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

    垃圾收集只会扔掉垃圾如果变量仍然可以访问内存,则内存不被视为垃圾

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

    你的特殊循环:

    for (;;) {}
    

    不会真正停止,因为它没有使用任何资源。当然,可以终止进程,也可以使用单独的线程来使用资源。这两个事件(以及其他事件)都可能导致循环停止,但它们都不在该循环的控制范围内