2008-10-17 14 views
8

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:

  1. ¿Alguien puede decirme qué es exactamente lo que está sucediendo? ¿Por qué Webstart abandona las JVM zombis?
  2. ¿Hay alguna manera de liberar explícitamente los recursos de Webstart sin detener la JVM?
  3. 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.

Respuesta

6

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 más información ver http://www.pushing-pixels.org/?p=232

+0

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

0

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 de cliente, consola webstanada apagada)

+0

no. la configuración predeterminada no es una ventana de consola.no hay ventanas en la pantalla en absoluto (barra de tareas vacía, alt + esc no hace nada) – ddimitrov

1

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 WebStart debe ser todo daemon cuando no se muestren las ventanas del sistema (consola, servicios javax.jnlp y otros cuadros de diálogo).

+0

¿Puedes dar un ejemplo de una fuga dentro de Swing (es decir, asignando recursos que no se pueden liberar con la API pública)? – ddimitrov

0

considerar adjuntar con jconsole y echar un vistazo a lo que la JVM está haciendo.

0

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?

Cuestiones relacionadas