需要调用System.err.close()或JVM不会退出。为什么?

时间:2011-06-26 22:32:30

标签: jvm hang standard-error

我们有一个(非常)多线程应用程序可以通过所有单元测试,但是从IDE或命令行运行时不会退出。这个应用程序不仅是多线程的,它执行本机进程,并写入标准错误和标准输出。 问题是应用程序会在退出时挂起。最后,我减少了应用程序,直到它与单元测试完全相同,并且它仍然会挂起,因此,我认为JUnit正在做一些命令行启动的事情。
当我在main(args)的末尾调用System.exit()时,应用程序将退出,最终将我引导至System.err.close()。
当然,应用程序永远不会“打开”System.err或System.out。它只是写入它们,并在完成时调用flush()。我只在64位Windows上测试过,稍后我会在Linux上测试。 JVM是Java(TM)SE运行时环境(版本1.6.0_24-b07)

为什么JVM不会退出的任何想法?

2 个答案:

答案 0 :(得分:1)

我似乎记得当你调用本机进程时,你必须小心地完全读取本机进程和/或错误的流,或者事情可以锁定。我想你可能需要产生一个线程来处理这个问题。只是一个想法。

答案 1 :(得分:0)

Linux上的所有程序都在某种程度上面临这个问题。一个打开文件句柄的进程(你显然有一个,即使你没有专门打开一个,它来自你的一个系统命令操作)也不会完全退出,直到所有句柄都关闭。我现在能想到的最好的例子是我在工作中遇到的一个问题,即启动java进程的启动脚本(bash)永远不会退出。问题是,我们正在做 2>& 1> / path / to / log& ,它不关闭stdin(文件句柄0)。把它归为&> / path / to / log 修复了问题,因为&>表示所有文件句柄,而另一个表示stdin和stderr。

你的问题很相似,而且它是多线程的,这加剧了这个问题。