У меня есть Java-программа, которая запускается через ProcessBuilder
из другой Java-программы.
System.exit(0)
вызывается из дочерней программы, но для некоторых наших пользователей (в Windows) процесс java.exe
, связанный с дочерним процессом, не завершается. Дочерняя программа не имеет перехватчиков завершения работы и не имеет SecurityManager
, которая может помешать System.exit()
завершить работу виртуальной машины. Я не могу воспроизвести проблему самостоятельно на Linux или Windows Vista. Пока что единственные сообщения о проблеме поступают от двух пользователей Windows XP и одного пользователя Vista, использующих две разные JRE (1.6.0_15 и 1.6.0_18), но они способны воспроизвести проблему каждый раз.
Может кто-нибудь предложить причины, по которым JVM не сможет завершиться после System.exit()
, и только на некоторых машинах?
Редактировать 1: Я попросил пользователя установить JDK, чтобы мы могли получить дамп потока с нарушающей ВМ. Пользователь сказал мне, что процесс виртуальной машины исчезает из VisualVM, как только он нажимает на пункт «Выход» в моем меню - но, согласно диспетчеру задач Windows, процесс не завершился, и неважно, как долго пользователь ждет (минуты, часы), он никогда не завершается.
Редактировать 2: Теперь я подтвердил, что Process.waitFor()
в родительской программе никогда не возвращается по крайней мере для одного из пользователей, имеющих проблему. Итак, подведем итог: дочерняя виртуальная машина, кажется, мертва (VisualVM даже не видит ее), но родитель все еще видит процесс как живой, как и Windows.