算法java无限循环何时停止?
我读过关于无限循环的书,发现在某些语言中,当堆栈溢出或达到分配的最大内存时,无限循环就会停止。根据程序和语言的类型,其他程序将永远循环。 我的问题是,java无限循环停止了吗?我只是好奇,因为java有一个垃圾收集器,当内存泄漏时,它会重用内存,以防达到分配的最大内存和堆栈溢出
还有,这种无限循环会停止吗
for( ; ; ){}
你可以在下面搜索框中键入要查询的问题!
我读过关于无限循环的书,发现在某些语言中,当堆栈溢出或达到分配的最大内存时,无限循环就会停止。根据程序和语言的类型,其他程序将永远循环。 我的问题是,java无限循环停止了吗?我只是好奇,因为java有一个垃圾收集器,当内存泄漏时,它会重用内存,以防达到分配的最大内存和堆栈溢出
还有,这种无限循环会停止吗
for( ; ; ){}
# 1 楼答案
有些做,有些不做。这取决于循环是如何实现的
基本上,你认为在其他语言中停止的情况在Java中也可以停止。。。取决于你如何编码它们
通过无限递归实现的循环将发生堆栈溢出。这在Java中比在某些语言中更容易“实现”。(没有尾部调用优化。)
如果循环重复分配保持可访问的对象,则会发生堆溢出。。。因此GC无法回收它们
(还有其他各种方式可以终止一个看似的无限循环。)
垃圾收集器回收无法访问的对象,但无法回收可访问的对象(即将来可能被程序使用的对象)
垃圾收集器不处理堆栈内存,因此与堆栈溢出故障无关
没有
严格地说,任何循环如果停止都不是无限的。。。不管什么原因。这包括堆栈溢出或内存耗尽等原因
但即使是无限循环也不是真正的无限循环。最终用户将杀死循环程序,电源将失效,硬件将被废弃。。。或者类似的
# 2 楼答案
无限循环不会停止,除非有其他原因导致整个过程崩溃:-)
这通常是资源短缺,无论是无限递归情况下的堆栈空间,还是在循环中分配(而不是释放)内存不足
垃圾收集只会扔掉垃圾如果变量仍然可以访问内存,则内存不被视为垃圾
换句话说,如果你的无限循环每次都在链表的末尾添加一个元素(并且你不会失去对头部的访问权),这些节点中的任何一个都不会被垃圾收集,你最终会耗尽内存
你的特殊循环:
不会真正停止,因为它没有使用任何资源。当然,可以终止进程,也可以使用单独的线程来使用资源。这两个事件(以及其他事件)都可能导致循环停止,但它们都不在该循环的控制范围内