Java 如何找出应用程序无法运行的原因';你不能完成死刑吗?
我有一个应用程序,它有最后一个语句Java 如何找出应用程序无法运行的原因';你不能完成死刑吗?,java,eclipse,Java,Eclipse,我有一个应用程序,它有最后一个语句System.out.println(“Done”),它已写入,但此后程序仍在运行。我如何检查它为什么在运行 是否可以使用系统。退出(0) 应用程序仅使用一个(主)线程。完成后的一切是: System.out.println("Done."); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } } } 可能是数据库连接吗?当
System.out.println(“Done”)代码>,它已写入,但此后程序仍在运行。我如何检查它为什么在运行
是否可以使用系统。退出(0)
应用程序仅使用一个(主)线程。完成后的一切是:
System.out.println("Done.");
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
}
可能是数据库连接吗?当您认为程序已经完成时,生成一个线程转储,并查看输出以查看当前执行的位置。你可能会发现它不是你所期望的
在Unix上,您应该能够使用kill-QUIT命令(其中pid是您的进程id)执行此操作。我相信在Windows上,您可以使用Ctrl+Break来完成同样的操作。我们刚刚遇到了一个类似的问题(尽管是在Ruby测试系统中)
事实证明,我们运行的子进程与父进程分离,挂起等待某些东西,但仍然保持标准输出打开,防止流监视循环终止,并保持进程活动
我通过在显然已挂起的进程上运行“lsof”找到了问题所在,看到它的管道仍然打开,并使用更多lsof跟踪这些管道。你的应用程序是多线程的吗?如果没有看到你的代码,很难判断可能仍然有一个非守护进程线程在运行。打印“完成”后,请尝试列出所有正确选项:如果应用程序在一个JVM中运行,则可以使用System.exit(0)停止JVM。否则,您的应用程序在多个JVM实例上运行,那么您必须停止所有JVM实例。您可以发布代码吗?