Pregunta

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 finalizó. El volcado de subprocesos mostró que hay un par de subprocesos que no son de daemon, especialmente EDT, AWT de Swing 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 está cerrado. La operación de cierre predeterminada es DISPOSE_ON_CLOSE. Cuando el contador llega a cero, detengo todos los grupos de subprocesos y libero todos los recursos de JNI.

Cuando inicié la aplicación desde un archivo bat (los mismos JAR), terminó bien cuando se cerraron todas las ventanas, así que pensé que el problema tiene algo que ver con Webstart.

Ahora las preguntas:

  1. ¿Alguien puede decirme qué está sucediendo exactamente? ¿Por qué Webstart deja zombies JVM?
  2. ¿Hay alguna forma de liberar los recursos Webstart explícitamente sin detener la JVM?
  3. 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 el sistema operativo para limpiar después de usted (lo que puede generar sorpresas desagradables si reutiliza el código más adelante) ... ¿me estoy perdiendo algo?

Consulte también pregunta de seguimiento para detectar si la aplicación ha sido iniciada por Webstart.

¿Fue útil?

Solución

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 de Java que uno esperaría cuando se eliminen todas las ventanas y los recursos de AWT.

Para obtener más información, consulte http://www.pushing-pixels.org/?p = 232

Otros consejos

El AWT EDT suele ser el culpable. Desde hace algunos años, se ha cerrado la lógica cuando no hay ventanas no deseadas. Sin embargo, hay problemas recurrentes con las fugas, incluso dentro de la implementación de AWT y Swing. Por lo tanto, sugiero usar System.exit en las versiones de producción (es posible que desee dejarlo para algunas pruebas para detectar fugas).

El hilo de WebStart debería ser todo demonio cuando no se muestren ventanas del sistema (consola, servicios javax.jnlp y otros diálogos).

Webstart inicia la ventana de la Consola (es posible que pueda desactivarla). La ventana de la consola se usa para ver stdout / err del proceso de inicio web, así como el 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ía llamar a System.exit () para estar 100% seguro de que su aplicación se cierra (a menos que pueda garantizar una determinada configuración del cliente, la consola de inicio web está apagada)

Considere asociarse con jconsole y eche un vistazo a lo que está haciendo la JVM.

Experimento el mismo problema con el inicio web. Si desactivo la consola java, el proceso no se cuelga. ¿Alguna identificación de error conocida de Sun?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top