Recientemente convertí una aplicación Swing a Webstart. El proceso fue bastante sencillo, pero descubrí que después de cerrar todas las ventanas, la JVM de mi aplicación no finalizaba. El volcado de subprocesos mostró que hay un par de subprocesos no-demoníacos, notablemente EDT de Swing, AWT y un par de subprocesos relacionados con websart.¿Tengo que llamar explícitamente a System.exit() en una aplicación Webstart?
La estrategia real utilizada es que cada ventana incrementa un contador cuando se crea y disminuye uno cuando se cierra. La operación de cierre predeterminada es DISPOSE_ON_CLOSE. Cuando el contador llega a cero, detengo todos los grupos de subprocesos y lanzo todos los recursos de JNI.
Cuando lancé la aplicación desde un archivo bat (los mismos JAR), finalizó bien cuando se cerraron todas las ventanas, así que pensé que el problema tenía algo que ver con Webstart.
Ahora las preguntas:
- ¿Alguien puede decirme qué es exactamente lo que está sucediendo? ¿Por qué Webstart abandona las JVM zombis?
- ¿Hay alguna manera de liberar explícitamente los recursos de Webstart sin detener la JVM?
- Siempre he tenido la opinión de que al llamar a System.exit() fomenta la práctica descuidada de no liberar sus recursos y confiar en que el sistema operativo limpiará después de usted (lo que puede ocasionar sorpresas desagradables si reutiliza el código más adelante) ... ¿Me estoy perdiendo de algo?
Consulte también el followup question para detectar si la aplicación ha sido iniciada por Webstart.
Gracias, el enlace explica todo lo que quería saber. ¿Hay algún ticket desfile con el que pueda votar? (En caso afirmativo, publique la respuesta como comentario a la pregunta principal) – ddimitrov