Comment puis-je générer une décharge de fil Java sur Linux

Environnement

  • Java
  • Linux et la plupart des environnements Unix
  • Comment puis-je générer une décharge de fil dans JBoss en cours d'exécution sur Linux?
  • Comment puis-je générer une trace de pile JBoss sur Linux?
  • Comment puis-je rediriger la sortie de kill -3 à un fichier?
  • JBoss a une forte utilisation cpu, se fige, se bloque ou ne libère pas threads inactifs, comment puis-je obtenir une décharge de fil à résoudre?
  • messages JMS se perdent, comment puis-je générer une décharge de fil pour enquêter?
  • Impossible de prendre décharge de fil à l'aide des kills -3 dans server.log ou console.log

Résolution

Voici les méthodes pour générer une décharge de fil Java sur Unix:

1) Notez le numéro d'identification de processus du processus Java (par exemple en utilisant le dessus. Grep sur ps -axw. Etc.) et envoyer un signal QUIT au processus avec le -quit de tuer ou tuer -3 commande. Par exemple:

2) Télécharger soit threaddump_linux.sh.tar.gz ou threaddump_solaris.sh.tar.gz. et extraire le script. Faire le executeable script avec chmod 755
Il va capturer une série de 6 décharges de fil espacés de 20 secondes d'intervalle (modifier au besoin), en passant dans le processus Java ID comme argument. Par exemple:

Assurez-vous de tester le script avant que la question arrive pour vous assurer qu'il fonctionne correctement dans votre environnement.

3) Télécharger soit threaddump_linux-continuous.sh.tar.gz ou threaddump_solaris-continuous.sh.tar.gz. et extraire le script. Faire le executeable script avec chmod 755
Il capture les décharges de fil espacés de 20 secondes d'intervalle (modifier au besoin), en transmettant l'ID de processus Java comme argument. Par exemple:

Assurez-vous de tester le script avant que la question arrive pour vous assurer qu'il fonctionne correctement dans votre environnement.

4) Utilisez la commande ci-dessous pour démarrer votre instance JBoss et utiliser ensuite tuer -3 pour générer les threaddumps.
Si l'application Java est démarré avec un script de service qui enregistre la sortie de la console, les décharges de fil seront dans le journal de la console. Dans le cas contraire, rediriger stdout vers un fichier au démarrage.

Ceci permet de rediriger votre sortie / threadump à la console de fichier spécifié dans la commande ci-dessus.

4) OpenJDK / Sun JDK
Utilisez JPS -lv pour trouver le processus Java ID pour l'émission tuer ou de tuer -quit -3.
Assurez-vous que l'option JVM -Xrs n'est pas utilisé, car il provoque SIGQUIT et les signaux de SIGWAITING à être ignoré. -3 commande kill envoie un signal SIGQUIT à la machine virtuelle Java, donc utiliser cette option provoquera kill -3 à être ignoré. Voir le lanceur d'applications Java.
Si vous utilisez OpenJDK ou Sun JDK 1.6 ou version ultérieure, en utilisant jstack est une option. Ceci est utile lors de la redirection sortie standard vers un fichier est problématique pour une raison quelconque (par exemple, il est souhaitable de ne pas redémarrer la machine virtuelle Java juste pour rediriger la sortie standard). Exécutez les opérations suivantes, en passant dans l'ID de processus Java:

5) Télécharger 'linux_jstack-continuous.tar.gz', et extraire le script. Faire le executeable script avec chmod 755
Il utilisera jstack pour capturer une série de six décharges de fil espacés de 20 secondes d'intervalle (modifier au besoin), en passant dans le processus Java ID comme argument. Assurez-vous de définir « JAVA_HOME » dans ce script. Il génère un fichier appelé « jstack_threaddump.out » dans le répertoire où ce script est exécuté. Par exemple:

  • Vérifiez que le processus Java est toujours en cours avec la commande ps aux (R ou S dans la colonne état STAT). Par exemple, jstack -F met le processus cible Java dans un « arrêt de trace » (T) de l'état. Sujets dans l'état (T) reçoivent le signal d'une décharge de fil; cependant, la production sera retardée jusqu'à ce que le processus se poursuit.
  • Vous devez vous assurer d'exécuter la commande jstack du même utilisateur que le processus java. S'il vous plaît voir cet article pour plus de détails.
  • Il y a des bugs connus liés à l'utilisation d'autres options de jstack (par exemple -F. -m. Etc.) et / ou outils de vidage de fil ne sont pas en mesure d'analyser la sortie, donc si d'autres options sont proposées en dehors -l, assurez-vous de tester la capture et l'analyse de la sortie.
  • Dans certaines circonstances jstack en cours d'exécution pourrait causer un impact sur les performances. Il est rapporté qu'une lenteur dans le temps de réponse peut être observée lors de l'exécution jstack dans certains scénarios.
  • Si vous voulez prendre fil des décharges pour identifier les threads Java consomment haute cpu, s'il vous plaît voir Comment identifier une utilisation élevée du processeur par des threads Java sur Linux / Solaris et utiliser l'exemple de script ci-joint dans l'article.
5.x JBoss EAP

Pour rediriger stdout vers un fichier au démarrage:

Si la redirection d'avoir du mal à stdout. modifier JBOSS_HOME $ / bin / run.sh et changer la ligne:

Sauvegardez et redémarrez JBoss normalement. Tuez -3 ou tuer -quit devrait créer un thread dump dans le fichier console.log.

6.x JBoss EAP

La recommandation est d'utiliser jstack.

Fusible JBoss 6

Si vous capturez fil des décharges d'un conteneur enfant, notez que le processus est différent du conteneur racine. Assurez-vous de vérifier l'ID de processus (PID) en utilisant « ps » ou similaire avant de sélectionner le PID pour exécuter le script contre. par exemple:

Pièces jointes

Articles Liés