Java semble bloqué
J'ai été en utilisant le Java Service wrapper dans une application personnalisée pour un bon moment et c'est très bien. Depuis la mise à jour de notre application d'une nouvelle version dans les derniers jours de la JVM commencé à traîner et puis wrapper imprime ce dans le journal:
JVM semble bloqué: expiration du délai d'attente du signal de la JVM.
Puis, il met automatiquement fin à la JVM et commence de nouveau l'application. Ce qui se passe après environ 10 heures de course, ce qui rend juste plus difficile à déboguer.
Bien sûr, je vais regarder à travers les changements que nous avons apportés, mais pas de changements majeurs ont été faits et que je soupçonne est à l'origine de ce type de problème.
Où puis-je regarder pour essayer de comprendre ce qui se passe? Les messages de débogage de l'application n'indiquent en rien d'intéressant. Si la JVM juste plante, il va généralement de créer un dump, ce qui peut aider au débogage, mais il est suspendu, il n'est donc pas la création d'un dump. Si je le fais pas redémarrer automatiquement le service est-il rien que je peux faire pour obtenir certaines informations utiles de la JVM avant de le redémarrer?
Il me semble que la JVM ne devrait pas accrocher à des erreurs de programmation. Qu'avez-vous exécuter en avant qui peut causer de la JVM pour les accrocher?
Vous devez vous connecter pour publier un commentaire.
Lire sur le wrapper.ping.propriété de délai d'attente. Le wrapper logiciel communique avec votre JVM temps à autre pour s'assurer qu'il est vivant. Si la communication échoue pour quelque raison que ce soit, le wrapper juge le processus hung et tente de redémarrer.
Selon la façon dont votre application est conçue, votre JVM peut être occupé à autre chose quand le wrapper essaie de faire un "ping" il.
Voir si vous pouvez utiliser la Visual VM pour voir ce qui se passe. Avoir le Visual VM surveiller l'application pour tout le temps et quand il cesse de travailler peut-être vous pouvez déterminer ce qui est mal.
Si la VM se bloque, vous pouvez obtenir de l'état des fils... je pense que le Visual VM va faire un peu plus facile, compte tenu de votre installation que l'habituel ctrl-pause (ou whatver la combinaison de touche est).
(À modifier selon le commentaire)
Est-il de toute façon vous pouvez l'exécuter sans le wrapper pour le débogage? Aussi, si vous utiliser le profileur NetBeans il peut vous donner une chance de s'en occuper quand il s'arrête (je vais vérifier plus tard aujourd'hui et voir si je peux trouver, si cela peut se comporter différemment).
Quel milieu êtes-vous? OS, version JVM, architecture matérielle?
Qui ne sonne comme un bug, et étant donné qu'il faut beaucoup d'heures, ça sonne comme une ressource-l'épuisement bug de la sorte.
J'ai eu un couple de différentes versions d'une bibliothèque dans le classpath (JBPM). Avec wrapper vous pouvez utiliser des caractères génériques pour inclure des bocaux. Soyez prudent avec cette même si, comme vous pouvez accidentellement inclure plus que vous devriez.
Ici est un IBM article qui donne des informations sur le débogage se bloque en Java. Il dit en gros qu'il y a deux choses qui peuvent causer des blocages:
Depuis j'en ai eu pour déboguer les autres pendaison de questions. Sur linux, vous pouvez envoyer la JVM le signal de fin d'en faire un thread dump de la console. Cela aide vraiment à comprendre où est la question. Utilisez cette commande pour le faire: tuer -QUITTER
Modifier 6/13/2017
Ces jours-je utiliser jmap inclus dans le JDK pour le dump l'ensemble de la mémoire du programme. Puis-je utiliser Eclipse de la Mémoire de l'Analyseur de voir l'état exact du programme quand il s'est écrasé. Vous pouvez regarder la liste de threads qui sont actives et inspecter les variables dans chaque frame de pile.
Où PID est l'ID de processus du processus java.