У меня есть 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, чтобы мы могли получить дамп потока от нарушительной виртуальной машины. Мне сказали, что процесс VM исчезает из VisualVM, как только он нажимает на элемент "Выход" в моем меню --- но, согласно диспетчеру задач Windows, процесс не прекращается и не зависит от того, как долго пользователь ждет (минуты, часы), он никогда не заканчивается.
Изменить 2: Я подтвердил, что Process.waitFor()
в родительской программе никогда не возвращается для хотя бы одного из пользователей, имеющих проблему. Итак, суммируем: дочерняя VM кажется мертвой (VisualVM ее даже не видит), но родитель все еще видит процесс как живой, а также делает Windows.