jar执行后是什么让java进程保持活动状态?

时间:2010-11-18 22:18:26

标签: java process

4 个答案:

答案 0 :(得分:4)

具有UI启动事件的Java应用程序处理不是“守护程序”线程的线程。也就是说,只要这些线程正在运行,程序就不会终止 - 即使当前没有窗口显示。

菜单上有“退出”命令吗?其Action应调用System.exit(0)

答案 1 :(得分:2)

如果代码中的所有内容都显示正常,则可能是孤立的线程仍在运行。

代码here描述了如何列出当前在JVM中运行的所有线程

或者,您可以使用具有内置探查器的探查器或IDE来查看正在运行的线程。

如果您能在代码完成后告诉我们哪些线程仍在运行,这将有助于回答此问题; 即使您的代码可能是单线程的,JVM中仍可能会运行其他线程,例如垃圾收集线程(虽然GC线程不会阻止JVM退出)

答案 2 :(得分:2)

只要有一个或多个非守护程序线程在运行,Java进程就会保持活动状态。

考虑使用位于Java JDK的bin目录中的JVisualVM并将其附加到Java程序。在那里,您将能够执行活动线程及其状态的分析以及执行线程转储。

答案 3 :(得分:2)

根据您的线程转储,它看起来像正在加载一个Google库(可能是Guice或Guava)。

Thread name: com.google.inject.internal.Finalizer 
java.lang.Object.wait(Native Method)
java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116) 
java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132) 
com.google.inject.internal.Finalizer.run(Finalizer.java:114) 

如果是这样,那么这个错误可能导致问题:

与终结器线程没有正确释放有关。发布了各种解决方法。