ProcessBuilder
启动。子程序调用System.exit(0)
,但是对于一些用户(在Windows上),与子程序关联的java.exe
进程没有终止。子程序没有关闭挂钩(shutdown hooks),也没有可能阻止System.exit()
终止VM的SecurityManager
。我无法在Linux或Windows Vista上复现该问题。到目前为止,唯一报告这个问题的是两个Windows XP用户和一个Vista用户,他们使用两个不同的JREs(1.6.0_15和1.6.0_18),但每次都能够复现该问题。有人可以提出JVM在
System.exit()
后未能终止,并且仅在某些机器上的原因吗?编辑1:我让用户安装JDK,以便我们可以从有问题的VM中获取线程转储。用户告诉我的是,只要他单击我的菜单中的“退出”项,VM进程就会从VisualVM中消失---但是,根据Windows任务管理器的说法,该进程尚未终止,无论用户等待多长时间(几分钟、几小时),它都不会终止。
编辑2:我现在已经确认,父进程中的
Process.waitFor()
对于至少一个有问题的用户永远不会返回。因此,总结一下:子VM似乎已经死了(甚至VisualVM都看不到它),但父进程仍然将该进程视为活动状态,并且Windows也是如此。
runFinalizersOnExit
的调用,也没有SecurityManager
,所以我认为这些不是原因。 - uckelman