Si vous avez une application Java qui consomme CPU quand il ne fait rien, comment déterminez-vous ce qu'il fait?

voix
12

J'appelle Java API d'un fournisseur, et sur certains serveurs, il semble que la machine virtuelle Java va dans une boucle d'interrogation de faible priorité après la connexion à l'API (CPU à l'utilisation de 100%). La même application sur d'autres serveurs ne présente pas ce comportement. Cela se produit sur WebSphere et Tomcat. L'environnement est difficile à mettre en place il est donc difficile d'essayer de faire quelque chose comme le profilage au sein d'Eclipse.

Est-il un moyen de profil (ou une autre méthode d'inspection) une application Java existante dans Tomcat cours d'exécution pour savoir quelles méthodes sont en cours d'exécution alors qu'il est dans cette spinwait sorte d'état? L'application exécute une seule méthode quand il est dans cet état (méthode du fournisseur). Fournisseur ne peut pas répliquer le comportement (bien sûr).


Mettre à jour:

En utilisant JConsole j'ai pu déterminer qui était en cours d'exécution et ce qu'ils faisaient. Il m'a fallu quelques heures pour comprendre alors pourquoi il le faisait. Le problème a fini par être que le pot de l'API du fournisseur qui a été utilisé ne correspond exactement à la configuration de la base de données qu'il utilisait. Il a été en défaut d'avoir suivi de traçage et de la performance activée sur les serveurs qui ont la légère désadaptation dans la configuration. J'ai utilisé un pot différent et tout va bien.

Merci donc, Joshua, pour votre réponse. JConsole était extrêmement facile à installer et à utiliser pour surveiller une application existante.

@Cringe - Je l'ai fait quelques expériences avec quelques-unes des options que vous proposez. J'ai eu quelques problèmes à obtenir JProfiler mis en place, il semble bon (mais cher). À l'avenir, je suis allé de l'avant et a ajouté le plug-in Eclipse Profiler et je vais être à la recherche sur les différentes profileurs open source pour comparer les fonctionnalités.

Créé 16/08/2008 à 01:45
source utilisateur
Dans d'autres langues...                            


8 réponses

voix
15

Si vous utilisez Java 5 ou version ultérieure, vous pouvez vous connecter à votre application à l' aide jconsole pour afficher tous les threads en cours d' exécution. jstack fera également une décharge de la pile. Je pense que cela devrait encore fonctionner même à l' intérieur d' un conteneur comme Tomcat.

Ces deux outils sont inclus avec JDK5 et plus tard (je suppose que le processus doit être au moins Java 5, si je peux me tromper)

Mise à jour: Il est également intéressant de noter que commençant par JDK 1.6 mise à jour 7 il y a maintenant un profileur fourni appelé VisualVM qui peut être lancé avec « jvisualvm ». On dirait qu'il est un projet java.net , donc des informations supplémentaires peuvent être disponibles à cette page. Je ne l' ai pas encore utilisé cela , mais il semble utile pour une analyse plus sérieuse.

J'espère que cela pourra aider

Créé 16/08/2008 à 03:12
source utilisateur

voix
2

Si elle est à des fins professionnelles et vous avez un peu d' argent à dépenser, essayer de mettre la main sur JProfiler . Si vous voulez juste pour obtenir un aperçu, essayez le Profiler Plugin Eclipse . Je l' ai utilisé plusieurs fois, mais je ne sais pas l'état actuel.

(?) Un nouveau projet du projet d'éclipse elle - même est aussi disponible: http://www.eclipse.org/tptp/ (Voir cet article ). Jamais utilisé, donc je ne peux pas dire si cela vaut la peine.

Il y a aussi une très bonne liste des profileurs open source disponible à http://www.manageability.org/blog/stuff/open-source-profilers-for-java

Créé 16/08/2008 à 06:40
source utilisateur

voix
6

Face au même problème je YourKit profileur . Il chargeur de ne pas activer à moins que vous connecter réellement il (bien qu'il ne s'ouvre un port pour écouter les connexions). Le profileur lui - même a une belle « obtenir quantité de temps passé dans chaque méthode » tout en travaillant dans son mode moins importune.

Une autre façon est de détecter la charge du processeur (via JNI, donc vous aurez besoin d' une bibliothèque externe pour cela) dans un thread « chien de garde » avec la plus haute priorité et commencez à enregistrer toutes les discussions lorsque le CPU est suffisamment élevée pour un temps assez long. Vous trouverez peut - être cet article enlightining.

Créé 16/08/2008 à 19:26
source utilisateur

voix
0

Pour l' amour complet: même si mon entreprise plus ou moins standardise Eclipse nous utilisons Netbeans (6 ans et plus) avec son inclus, profileur libre sur une base quotidienne. Il fonctionne mieux que le plug - in Eclipse TPTP et pour nous (il y a 3 mois dernier vérifié) il élimine tout besoin d'un profileur commercial comme JProfiler, ce qui est excellent, mais devient rapidement inutile.

Créé 19/08/2008 à 19:50
source utilisateur

voix
0

VisualVM devrait être le profileur de NetBeans en mode autonome. J'ai essayé le TPTP pour eclipse mais VisualVM semble comme une option beaucoup plus agréable!

Créé 21/08/2008 à 12:51
source utilisateur

voix
1

Utilisez un profileur. Oui , ils coûtent de l' argent, et leur utilisation peut parfois être un peu maladroit, mais ils ne vous donnent beaucoup plus de preuves réelles plutôt que de devinettes.

Les êtres humains sont universellement mauvais à deviner où les goulots d'étranglement sont. Il semble juste être quelque chose que nos cerveaux ne sont pas construire à faire très bien. Il peut sembler évident, vous pouvez avoir de grandes idées sur ce que le problème, mais le monde réel s'avère souvent être faire quelque chose de différent. Et l' optimisation de la mauvaise partie de moyens de code, au mieux, beaucoup de travail pour un bénéfice minimal. Le plus souvent , cela rend les choses plus lentement, et parfois il casse tout à fait les choses. Donc , avant de faire des changements dans un souci d'optimisation, vous devriez toujours avoir des preuves réelles d'un profileur ou un autre outil précis.

Comme mentionné précédemment, les deux JProfiler et YourKit sont à la fois assez bon et un coût non prohibitif. La dernière fois que je regardais, ils avaient tous deux démos gratuites aussi.

Créé 21/08/2008 à 13:49
source utilisateur

voix
2

Si JConsole ne peut pas être utilisé, vous pouvez

  • appuyez sur CTRL+ BREAKsous Windows
  • envoyer kill -3 <process id>sous Linux

pour obtenir un vidage complet du fil. Cela n'affecte pas les performances et peut toujours être exécuté dans la production.

Créé 23/08/2008 à 09:22
source utilisateur

voix
2

JRockit Mission Control Analyzer Latence.

L'analyseur Latence qui vient avec JRockit vous montre ce que la machine virtuelle Java est « fait » quand il ne fait rien. Dans la dernière version, vous pouvez voir latences pour:

  • Java attente / bloqué / sommeil / stationnement.
  • File I / O
  • E / S réseau
  • L'allocation de mémoire
  • pauses GC
  • latences JVM, génération de code, par exemple et le chargement des classes
  • suspension de fil

L'outil vous donnera la trace de la pile lorsque la latence est survenue. Vous pouvez afficher les données de latence de plusieurs façons différentes (traces agrégées, sous forme d'histogramme, dans un graphe de fil, etc.). L'outil vous permet également de voir les transitions entre les fils, par exemple quand un thread signale une autre.

Analyseur de latence http://blogs.oracle.com/hirt/WindowsLiveWriter/The.0LatencyAnalyserMigratedfromtheoldBE_7246/latency_graph_2.png

Les frais généraux est négligeable et contrairement à beaucoup d' autres outils , il peut être utilisé dans un environnement de production. Ce blog vous donne une brève introduction et le programme peut être téléchargé ici .

Il est libre d'utiliser pour le développement!

Créé 29/09/2008 à 22:00
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more