Question

Récemment, j'ai converti une application Swing en Webstart. Le processus était assez simple, mais j'ai constaté qu'après la fermeture de toutes les fenêtres, la machine virtuelle Java de mon application ne s'est pas arrêtée. Le vidage de threads a montré qu'il existe quelques threads non démons, notamment les fichiers EDT, AWT de Swing et quelques threads liés au WebSart.

La stratégie actuelle consiste à faire en sorte que chaque fenêtre incrémente un compteur lors de la création et décrémente à la fermeture. L'opération de fermeture par défaut est DISPOSE_ON_CLOSE. Lorsque le compteur atteint zéro, j'arrête tous les pools de threads et libère toutes les ressources JNI.

Lorsque j'ai lancé l'application à partir d'un fichier bat (mêmes fichiers JAR), elle s'est terminée correctement lorsque toutes les fenêtres ont été fermées. J'ai donc pensé que le problème avait un lien avec Webstart.

Maintenant les questions:

  1. Quelqu'un peut-il me dire ce qui se passe exactement? Pourquoi Webstart laisse-t-il des machines virtuelles zombie?
  2. Existe-t-il un moyen de libérer les ressources Webstart de manière explicite sans arrêter la JVM?
  3. J'ai toujours pensé qu'appeler System.exit () encourage la pratique bâclée de ne pas libérer ses ressources et de ne pas compter sur le système d'exploitation pour nettoyer après vous (ce qui peut entraîner de mauvaises surprises si vous réutilisez le code ultérieurement). ... est-ce que je manque quelque chose?

Voir aussi le question de suivi pour détecter si l'application a été lancée par Webstart.

Était-ce utile?

La solution

En raison de bugs dans WebStart, oui. WebStart démarre un " thread sécurisé " pour ses propres fins qui interagit avec l'EDT. Cette SecureThread empêche l’arrêt automatique du processus Java attendu lorsque toutes les ressources Windows et AWT sont supprimées.

Pour plus d'informations, voir http://www.pushing-pixels.org/?p = 232

Autres conseils

Le TFT AWT est généralement le coupable. Depuis quelques années, il est logique de s’arrêter s’il n’ya pas de fenêtres non dépliées. Cependant, il existe des problèmes récurrents de fuites, y compris lors de la mise en œuvre de AWT et de Swing. Par conséquent, je suggère fortement d’utiliser System.exit dans les versions de production (vous pouvez éventuellement laisser de côté les tests pour détecter les fuites).

Le thread WebStart doit tous être un démon lorsqu'il n'y a aucune fenêtre système (console, services javax.jnlp et autres boîtes de dialogue) affichée.

Webstart lance la fenêtre de la console (vous pourrez peut-être le désactiver). La fenêtre de la console est utilisée pour voir stdout / err du processus de démarrage Web ainsi que le journal / débogage rudimentaire, mais a pour effet secondaire de créer une fenêtre AWT / Swing de niveau supérieur. Comme AWT / EDT ne se termine que lorsque la dernière fenêtre est supprimée, la fenêtre de la console bloque votre application. Vous devez probablement appeler System.exit () pour être sûr à 100% de la fermeture de votre application (sauf si vous pouvez garantir une certaine configuration client, console Webstart désactivée)

Envisagez de vous connecter avec jconsole et découvrez ce que fait la machine virtuelle Java.

Je rencontre le même problème avec Web Start. Si je désactive la console java, le processus ne raccroche pas. Un identifiant de bogue connu de Sun?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top