Tengo un programa Java que se inicia a través de ProcessBuilder
desde otro programa Java. System.exit(0)
se llama desde el programa secundario, pero para algunos de nuestros usuarios (en Windows) el proceso java.exe
asociado con el hijo no finaliza. El programa secundario no tiene ganchos de apagado, ni tiene un SecurityManager
que podría detener System.exit()
de la terminación de la máquina virtual. No puedo reproducir el problema yo mismo en Linux o Windows Vista. Hasta ahora, los únicos informes del problema provienen de dos usuarios de Windows XP y un usuario de Vista, usando dos JRE diferentes (1.6.0_15 y 1.6.0_18), pero pueden reproducir el problema todo el tiempo.¿Qué puede hacer que Java siga funcionando después de System.exit()?
¿Alguien puede sugerir razones por las cuales la JVM no podría terminar después de System.exit()
, y luego solo en algunas máquinas?
Edit 1: Solicité al usuario que instalara el JDK para que pudiéramos obtener un volcado de subprocesos de la máquina virtual infractora. Lo que el usuario me dijo es que el proceso VM desaparece de VisualVM tan pronto como hace clic en el elemento 'Salir' de mi menú --- pero, de acuerdo con el Administrador de tareas de Windows, el proceso no ha terminado, y no importa cuánto tiempo el usuario espera (minutos, horas), nunca termina.
Editar 2: He confirmado ahora que Process.waitFor()
en el programa principal nunca regresa para al menos uno de los usuarios que tienen el problema. Entonces, para resumir: la máquina virtual hija parece estar muerta (VisualVM ni siquiera la ve) pero el padre aún ve el proceso como vivo y también lo hace Windows.
Si se trata de un finalizador, entonces no es una en nuestro código --- que don' t tiene alguno.Estoy seguro de que el hijo aún se está ejecutando, ya que vemos dos procesos de Java y el usuario no tiene ningún otro programa en su sistema que use Java. Esperaba evitar pedirle que instalara el JDK para poder usar jstack, pero creo que esa podría ser la mejor manera de proceder. – uckelman
Lo que quise decir sobre el proceso secundario es, ¿le quedan hilos? ¿Todavía está respondiendo a la entrada? ¿Todavía tiene asas abiertas? Estoy más familiarizado con Unix que con Windows, pero sé que los procesos no se borran del sistema operativo Unix hasta que el proceso principal los recoge y creo que es lo mismo en Windows. El hecho de que aparezca en la parte superior o en el Administrador de Tareas no significa que todavía esté activo. Por supuesto, eso no explica por qué solo le sucede a algunos usuarios ... –
De manera predeterminada, los finalizadores no se ejecutan al salir; ver http://java.sun.com/javase/6/docs/api/java/lang/System.html#runFinalizersOnExit(boolean) –