【发布时间】:2010-04-10 20:04:02
【问题描述】:
我有一个 Java 程序正在通过 ProcessBuilder 从另一个 Java 程序启动。
System.exit(0) 是从子程序调用的,但对于我们的一些用户(在 Windows 上),与子程序关联的 java.exe 进程不会终止。子程序没有关闭挂钩,也没有SecurityManager 可能会阻止System.exit() 终止VM。我自己无法在 Linux 或 Windows Vista 上重现该问题。到目前为止,该问题的唯一报告来自两名 Windows XP 用户和一名 Vista 用户,他们使用两种不同的 JRE(1.6.0_15 和 1.6.0_18),但他们每次都能重现该问题。
谁能指出 JVM 在System.exit() 之后无法终止的原因,然后仅在某些机器上?
编辑 1: 我让用户安装 JDK,以便我们可以从有问题的 VM 中获取线程转储。用户告诉我的是,只要他单击菜单中的“退出”项,VM 进程就会从 VisualVM 中消失 --- 但是,根据 Windows 任务管理器,该进程并没有终止,无论多长时间用户等待(分钟,小时),它永远不会终止。
编辑 2: 我现在已经确认父程序中的 Process.waitFor() 永远不会为至少一个有问题的用户返回。所以,总结一下:子虚拟机似乎已经死了(VisualVM 甚至看不到它),但父虚拟机仍然认为该进程是活动的,Windows 也是如此。
【问题讨论】:
标签: java exit processbuilder