什么会导致 Java 在 System.exit() 之后继续运行?

2024-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(),然后只在某些机器上?

Edit 1:我让用户安装了 JDK,这样我们就可以从有问题的虚拟机中获取线程转储。用户告诉我的是,一旦他单击菜单中的“退出”项,VM 进程就会从 VisualVM 中消失——但是,根据 Windows 任务管理器,该进程并没有终止,无论多久用户等待(分钟,小时),它永远不会终止。

Edit 2:我现在已经确认Process.waitFor()父程序中的至少一个有问题的用户永远不会返回。因此,总结一下:子 VM 似乎已死亡(VisualVM 甚至看不到它),但父 VM 仍将进程视为活动进程,Windows 也是如此。


如果您的代码(或您使用的库)具有关闭挂钩或未完全完成的终结器,则可能会发生这种情况。

强制关闭的更有效的方法(因此只能在极端情况下使用!)是运行:

Runtime.getRuntime().halt(0);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么会导致 Java 在 System.exit() 之后继续运行? 的相关文章

随机推荐