JVM不会终止

时间:2011-09-12 10:08:56

标签: java jvm terminate

我对一些不会终止的中等复杂度代码进行了简单的测试,即主要方法完成但过程不会消失。

以下是代码的详细说明(这里太长了,无法粘贴):

  • ProcessBuilder用于创建一堆子进程。它们都正常死亡(如果你能相信VisualVM)。
  • 我们使用log4j。
  • 主要算法在FutureTask内部运行,run以及之后get被调用。
  • 我们没有明确使用RMI,即使线程列表似乎也是如此。

显然,我可以致电System.exit(0),但我想知道这里有什么不妥。我无法生成最小的失败示例。另外,我无法从线程列表中找出明显的罪魁祸首;也许你可以吗?

from VisualVM after main terminates

修改:请参阅here了解主题转储。

2 个答案:

答案 0 :(得分:4)

Scorpion引导我找到正确的答案:

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

通过将远程对象传递给UnicastRemoteObject,可以明确强制要清理远程对象。如果对所有先前导出的对象执行此操作,UnicastRemoteObject.unexportObject(., true)将终止,JVM可以自由关闭。

答案 1 :(得分:2)

你提到FutureTask。我想到的第一件事是:你使用ExecutorService并忘记关闭它吗?

我想到的第二件事是:你是否正在阅读流程中的所有流?我很久以前就和子过程一起工作过,而且我记不清楚了。我遇到了与你描述的类似的问题,通过阅读流到最后,问题会大量消失!