JVM 不会终止

Rap*_*ael 5 java jvm terminate

我对一些不会终止的中等复杂性代码进行了简单的测试,即 main 方法完成但进程没有终止。

这是代码的纲要(太长,无法粘贴在这里):

  • ProcessBuilder用于创建一堆子流程。它们都正常死亡(如果你能相信 VisualVM)。
  • 我们使用 log4j。
  • 主算法在 a 内运行,稍后将FutureTask在其上调用。runget
  • 我们没有明确使用 RMI,尽管线程列表似乎是这样建议的。

显然,我可以调用System.exit(0),但我想知道这里有什么问题。我还没有能够产生一个最小的失败例子。另外,我无法从线程列表中找出明显的罪魁祸首;也许你可以?

main 终止后来自 VisualVM

编辑:有关线程转储,请参见此处

Rap*_*ael 4

蝎子带领我找到了正确的答案:

RMI Reaper类似于远程对象的垃圾收集器,例如(的子类)的实例UnicastRemoteObject。它是一个非守护线程,因此如果仍然存在无法清理的导出对象,则会阻止 JVM 终止。

从这个意义上讲,您可以通过将远程对象传递给 来显式强制清理远程对象UnicastRemoteObject.unexportObject(., true)。如果您对所有先前导出的对象执行此操作,RMI Reaper则会终止并且 JVM 可以自由关闭。