如何在Java中检测无限循环?

如何在Java中检测无限循环?,java,infinite-loop,Java,Infinite Loop,我运行一个Java程序,它不会在很长时间内结束。我猜这可能是代码中的无限循环,但我看不到代码(无法修改它) 如何判断它是否处于无限循环中 这是一个面试问题,我的答案是判断PC(程序计数器)是否在循环中。但是面试官给了我一个提示,使用那个程序的栈和堆。理论上,你不能。这就是停滞不前的问题 实际上,您可以检查调用堆栈中的周期。Java一旦耗尽内存并转储堆栈跟踪,就会崩溃。单调乏味,可能有用。我认为您可以使用try/catch方法 前 试一试{ }捕获(例外e){ System.err.printl

我运行一个Java程序,它不会在很长时间内结束。我猜这可能是代码中的无限循环,但我看不到代码(无法修改它)

如何判断它是否处于无限循环中



这是一个面试问题,我的答案是判断PC(程序计数器)是否在循环中。但是面试官给了我一个提示,
使用那个程序的栈和堆

理论上,你不能。这就是停滞不前的问题


实际上,您可以检查调用堆栈中的周期。Java一旦耗尽内存并转储堆栈跟踪,就会崩溃。单调乏味,可能有用。

我认为您可以使用try/catch方法

试一试{

}捕获(例外e){
System.err.println(“检测到的Infinte循环:”)如果你使用的是Eclipse或Netbeans之类的IDE,请使用调试工具。使用java配置文件并检查Stats告诉他,如果你知道答案,那么你会的。连接调试器,断开所有线程,看看它们在做什么。如果你找到了这个问题的答案,成千上万的计算机科学家都想知道w这个词ith you.Re:“这是停止问题”:它与停止问题有点相反;停止问题只给你程序源(和输入),而这个问题让你观察正在运行的程序,但不给你它的源。(但即使如此,我同意,这在所有情况下都是不可能的。)Java字节码在数学上等同于图灵机的指令(图灵机的内存是无限的除外)。因此“源代码”就在那里。但是在调用堆栈中找不到任何“循环”当你在无限循环中时。如果它是高度递归的,是的,但是在循环中调用堆栈上不一定发生任何事情。但是停止问题并不是说你永远无法判断一个程序是否停止(它是否在无限循环中,粗略地说,或者它是否在无限循环中).停顿的问题只是说你不能编写一个总是能说出的程序。因此,从理论上讲,你当然可以在很多情况下说出,但不是在所有情况下都能说出。试试占卜:烧一些意大利面,然后调用飞行的意大利面怪物,它会告诉你循环是否无限。它的工作原理与上面一样好。如果nite loop抛出了一个异常,它将停止,这意味着它首先不是无限的。你怎么认为无限循环会抛出异常?@ErwinBolwidt我可以诚实地说,这是我见过的最好的评论,我希望它永远不会被删除