我对一些不会终止的中等复杂度代码进行了简单的测试,即主要方法完成但过程不会消失。
以下是代码的详细说明(这里太长了,无法粘贴):
ProcessBuilder
用于创建一堆子进程。它们都正常死亡(如果你能相信VisualVM)。FutureTask
内部运行,run
以及之后get
被调用。显然,我可以致电System.exit(0)
,但我想知道这里有什么不妥。我无法生成最小的失败示例。另外,我无法从线程列表中找出明显的罪魁祸首;也许你可以吗?
修改:请参阅here了解主题转储。
答案 0 :(得分:4)
Scorpion引导我找到正确的答案:
RMI Reaper
类似于远程对象的垃圾收集器,例如({1}}的(子类)的实例。它是一个非守护程序线程,因此如果仍有导出的对象无法清除,则会阻止JVM终止。
通过将远程对象传递给UnicastRemoteObject
,可以明确强制要清理远程对象。如果对所有先前导出的对象执行此操作,UnicastRemoteObject.unexportObject(., true)
将终止,JVM可以自由关闭。
答案 1 :(得分:2)
你提到FutureTask。我想到的第一件事是:你使用ExecutorService并忘记关闭它吗?
我想到的第二件事是:你是否正在阅读流程中的所有流?我很久以前就和子过程一起工作过,而且我记不清楚了。我遇到了与你描述的类似的问题,通过阅读流到最后,问题会大量消失!