java - example - ¿Debo llamar explícitamente a System.exit() en una aplicación Webstart?
java web start launcher (5)
Debido a errores en WebStart, sí. WebStart inicia un "hilo seguro" para sus propios fines que interactúa con el EDT. Este SecureThread evita la terminación automática del proceso Java que uno esperaría cuando se eliminan todas las ventanas y los recursos AWT.
Para obtener más información, consulte http://www.pushing-pixels.org/?p=232
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.
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 tiene algo que ver con Webstart.
Ahora las preguntas:
- ¿Alguien puede decirme qué está pasando exactamente? ¿Por qué Webstart abandona las JVM zombis?
- ¿Hay alguna forma de liberar los recursos de Webstart explícitamente sin detener la JVM?
- Siempre he tenido la opinión de que llamar a System.exit () fomenta la práctica descuidada de no liberar sus recursos y confiar en que el sistema operativo lo solucione (lo que puede llevar a sorpresas desagradables si reutiliza el código más adelante) ... ¿Me estoy perdiendo de algo?
Consulte también la pregunta de seguimiento para detectar si la aplicación ha sido iniciada por Webstart.
El AWT EDT suele ser el culpable. Desde hace algunos años ha tenido cierta lógica para apagar cuando no hay ventanas sin oposición. Sin embargo, hay problemas recurrentes con fugas, incluso dentro de la implementación de AWT y Swing. Por lo tanto, sugiero utilizar System.exit en las versiones de producción (es posible que desee dejarlo fuera para algunas pruebas para detectar fugas).
El hilo de WebStart debe ser todo daemon cuando no se muestren las ventanas del sistema (consola, servicios javax.jnlp y otros cuadros de diálogo).
Webstart inicia la ventana de la consola (es posible que pueda desactivarla). La ventana de la consola se utiliza para ver la salida estándar / err del proceso de webstart, así como un registro / depuración rudimentario, pero tiene el efecto secundario de crear una ventana AWT / Swing de nivel superior. Como el AWT / EDT solo finaliza cuando se elimina la última ventana, la ventana de la consola está demorando su aplicación. Probablemente deberías llamar a System.exit () para estar 100% seguro de que tu aplicación se cierra (a menos que puedas garantizar cierta configuración del cliente, consola webstart desactivada)
Considere adjuntar con jconsole y vea lo que está haciendo la JVM.
Experimento el mismo problema con el inicio web. Si apago la consola de Java, el proceso no se cuelga. ¿Algun identificación de error conocida de Sun?