Dépannage processus Java avec une très forte utilisation de l'UC - application Tomcat
J'ai une application java qui s'exécute sur le serveur Tomcat (qui s'exécute en tant que service sous Windows), le processus java pour qui continue de bouffer du CPU avant de finalement m'oblige à redémarrer le service Tomcat.
D'abord ma configuration:
Windows 2003 serveur
Tomcat 6, exécute en tant que service à l'aide de Wrapper
JDK: 1.6.0_20
J'ai été voir des captures problèmes ici et là menant jusqu'à hier. J'ai dû redémarrer midi d'hier, puis à 2:30 ce matin, puis aujourd'hui, j'arrivais à peine à redémarrer l'application et l'ouvrir jconsole à surveiller avant de frapper à 99% d'utilisation du PROCESSEUR de nouveau. Grâce à une combinaison de choses que je ne suis pas tout à fait sûr de, il semble que je suis la JVM de cycle de lui-même et l'application a été planant dans les 10 à 30% d'utilisation du PROCESSEUR de la gamme pour un couple d'heures. Toutefois, alors il a commencé à ramper vers le haut à nouveau, va enfin dans ses 99% d'utilisation du PROCESSEUR en panne. J'étais aussi de la difficulté avec l'utilisation de mémoire, mais qui est resté relativement normale et régulière depuis que j'ai soi-disant eu la JVM de "cycle" (mauvaise terminologie, peut-être, mais c'est vraiment ce qu'elle semble faire - et dans le journal wrapper il y avait un dump de toutes les classes qu'elle était en train de recharger après).
Ensuite, j'ai été de creuser autour et a trouvé un JRE 6 Update 24 installé sur le serveur (je n'ai pas l'installer car je doit faire un test avec chaque mise à jour java - mais peut-être que mon serveur admin fait la mise à jour). J'ai essayé, mais ne pouvez pas désinstaller cette. Ainsi, je reçois des différentes versions, quand je fais un java -version
contre javac -version
java -version
java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
Java HotSpot(TM) Client VM (build 19.1-b02, mixed mode, sharing)
javac -version
javac 1.6.0_20
Cette différence pourrait être à l'origine d'une JVM des conflits de toutes sortes? JAVA_HOME et mes variables de CHEMIN d'accès à la fois à la bonne installation du JDK.
En espérant pour plus de stabilité, j'ai décidé de changer mon application à exécuter sur le précédent JDK qui était encore installé JDK 1.6.0_04. J'ai changé le wrapper.conf, définir des variables d'environnement, nettoyé et reconstruit, et a commencé. Cela ne semble plus stable et a été en place pendant environ 4 heures. L'utilisation du CPU a grimpé à 90, elle semble s'effacer de lui-même à nouveau.
J'ai fait heapdumps puis a couru à travers la Mémoire de l'Analyseur dans Eclipse (rien de nouveau trouvé là), j'ai utilisé de la jconsole avec jtop à regarder threads - rien ne saute, donc pourquoi je continue à être curieux de savoir si c'est une java/jvm question. Donc, je sais que c'est un long post mais je ne sais vraiment pas où aller à partir d'ici. Des idées?
(Je l'ai fait exhaustive, la recherche sur le web sur ce et certains articles ont souligné, éventuellement, d'un Quartz d'émission ou mise en veille prolongée ne trouvez pas de rinçage. Rien n'a changé dans l'application depuis que j'ai commencé à voir le PROCESSEUR problèmes, donc je ne suis pas sûr de l'endroit où pour commencer le dépannage si il pourrait en effet être lié à l'un ou l'autre.)
OriginalL'auteur Nicole S. | 2011-08-12
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas un problème facile. Vous faites tous les éléments de base pour voir si elle a quelque chose de sauts. Il sonne comme il y a une fuite lente qui s'accumule au fil du temps, au point où il ne peut pas fonctionner. Cela sonne comme la GC est raclée et app vient de répondre. Il pourrait également être runaway tâche en arrière-plan(s) de manger sur le CPU et le juste n'est pas complète, qui pourrait expliquer le retard. Vous pouvez essayer de désactiver les quartz pour voir si elle reste plus longtemps qui pourrait aider à vous conduire dans une direction, ou de la manivelle vers le haut de sorte qu'il apparaît plus tôt.
Je sais que vous avez fait de la jconsole à regarder, mais je pense que vous avez besoin de revoir et de surveiller votre utilisation de la mémoire, les threads s'exécutent en temps, combien de temps vous passez dans le GC, et en regardant ce que les portions de mémoire sont en train d'être mangé (c'est d'Eden, la propriété qui est en train de disparaître?).
J'avais assurez-vous d'écrire hors de début et de fin des messages pour vos travaux en arrière-plan de l'exécution dans le Quartz. Ensuite, vous pouvez mettre en corrélation quand elles commencent et finissent avec lorsque ce problème commence. Vous indiquera également si vos travaux sont de finition ou pas.
Il est probablement temps de le déposer dans un profiler (au lieu de jconsole) de sorte que vous pouvez voir où dans le code, c'est passer du temps ou ce qu'il en soufflant de la mémoire. Un vrai profiler vous permettra de voir toutes les données de la purée sur votre code et des classes. Mon favoris est JProfiler, mais YourKit est également bon. Vous pouvez obtenir un 7-30 jours d'essai de sorte que vous aurez beaucoup de temps pour le profil et la figure de votre question sans avoir à l'acheter.
Début de ce début de matinée, de sorte que vous aurez, je l'espère, quelque chose en début de nuit.
OriginalL'auteur chubbsondubs