Si vous disposez d'une application Java qui consomme du processeur alors qu'elle ne fait rien, comment déterminer ce qu'elle fait ?

StackOverflow https://stackoverflow.com/questions/12927

  •  08-06-2019
  •  | 
  •  

Question

J'appelle l'API Java d'un fournisseur et, sur certains serveurs, il semble que la JVM entre dans une boucle d'interrogation de faible priorité après s'être connectée à l'API (CPU utilisé à 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 délicat à configurer, il est donc difficile d'essayer de faire quelque chose comme le profilage dans Eclipse.

Existe-t-il un moyen de profiler (ou une autre méthode d'inspection) une application Java existante exécutée dans Tomcat pour savoir quelles méthodes sont exécutées alors qu'elle se trouve dans ce type d'état d'attente ?L'application n'exécute qu'une seule méthode lorsqu'elle se trouve dans cet état (méthode du fournisseur).Le fournisseur ne peut pas reproduire le comportement (bien sûr).


Mise à jour:

En utilisant JConsole, j'ai pu déterminer qui courait et ce qu'il faisait.Il m'a fallu quelques heures pour comprendre pourquoi il faisait cela.Le problème a fini par être que le fichier jar API du fournisseur utilisé ne correspondait pas exactement à la configuration de la base de données qu'il utilisait.Par défaut, le traçage et la surveillance des performances étaient activés sur les serveurs présentant une légère différence de configuration.J'ai utilisé un pot différent et tout va bien.

Alors merci, Joshua, pour votre réponse.JConsole était extrêmement simple à configurer et à utiliser pour surveiller une application existante.

@Cringe - J'ai expérimenté certaines des options que vous avez suggérées.J'ai eu quelques problèmes avec la configuration de JProfiler, ça a l'air bien (mais cher).À l’avenir, j’ai ajouté le plugin Eclipse Profiler et j’examinerai les différents profileurs open source pour comparer les fonctionnalités.

Était-ce utile?

La solution

Si vous utilisez Java 5 ou version ultérieure, vous pouvez vous connecter à votre application en utilisant jconsole pour afficher tous les threads en cours d'exécution.jstack fera également un vidage de pile.Je pense que cela devrait toujours fonctionner même dans un conteneur comme Tomcat.

Ces deux outils sont inclus avec JDK5 et versions ultérieures (je suppose que le processus doit être au moins Java 5, même si je peux me tromper)

Mise à jour:Il convient également de noter qu'à partir de la mise à jour 7 du JDK 1.6, il existe désormais un profileur intégré appelé VisualVM qui peut être lancé avec 'jvisualvm'.On dirait que c'est un projet java.net, des informations supplémentaires peuvent donc être disponibles sur cette page.Je ne l'ai pas encore utilisé mais cela semble utile pour une analyse plus sérieuse.

J'espère que cela pourra aider

Autres conseils

Face au même problème que j'ai utilisé Profileur YourKit.Son chargeur ne s'active que si vous vous y connectez réellement (bien qu'il ouvre un port pour écouter les connexions).Le profileur lui-même permet de « gagner du temps dans chaque méthode » tout en travaillant dans son mode moins intrusif.

Une autre façon consiste à détecter la charge du processeur (via JNI, vous auriez donc besoin d'une bibliothèque externe pour cela) dans un thread "de surveillance" avec la priorité la plus élevée et à commencer à enregistrer tous les threads lorsque le processeur est suffisamment élevé pendant une période suffisamment longue.Vous pourriez trouver Cet article éclairant.

Si c'est à des fins professionnelles et que vous avez de l'argent à dépenser, essayez de mettre la main dessus JProfiler.Si vous souhaitez simplement avoir un aperçu, essayez le Plugin de profilage Eclipse.Je l'ai utilisé plusieurs fois, mais je ne connais pas l'état actuel.

Un nouveau (?) projet du projet Eclipse lui-même est également disponible : http://www.eclipse.org/tptp/ (Voir Cet article).Je ne l'ai jamais utilisé, donc je ne peux pas dire si cela en vaut la peine.

Il existe également une très bonne liste de profileurs open source disponibles sur http://www.manageability.org/blog/stuff/open-source-profilers-for-java

Analyseur de latence de contrôle de mission JRockit.

L'analyseur de latence fourni avec JRockit vous montre ce que la JVM « fait » lorsqu'elle ne fait rien.Dans la dernière version, vous pouvez voir les latences pour :

  • Java attend/bloqué/veille/garé.
  • E/S de fichier
  • E/S réseau
  • Allocation de mémoire
  • Le GC fait une pause
  • Latences JVM, par exemple génération de code et chargement de classes
  • Suspension du fil

L'outil vous donnera la trace de la pile lorsque la latence s'est produite.Vous pouvez visualiser les données de latence de différentes manières (traces agrégées, sous forme d'histogramme, dans un graphique de fil, etc.).L'outil vous permet également de voir les transitions entre les threads, par exemple lorsqu'un thread en informe un autre.

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

La surcharge est négligeable et contrairement à de nombreux autres outils, il peut être utilisé dans un environnement de production.Ce article de blog vous donne une brève introduction et le programme peut être téléchargé ici.

Son utilisation est gratuite pour le développement !

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

  • presse CTRL+CASSER sous Windows
  • envoyer kill -3 <process id> sous Linux

pour obtenir un Thread Dump complet.Cela n'affecte pas les performances et peut toujours être exécuté en production.

Utilisez un profileur. Oui, ils coûtent de l’argent et leur utilisation peut parfois être un peu délicate, mais ils vous fournissent bien plus de preuves réelles que de suppositions.

Les êtres humains sont universellement incapables de deviner où se situent les goulets d’étranglement en matière de performances.Cela semble simplement être quelque chose pour lequel notre cerveau n’est pas conçu.Cela peut sembler évident, vous avez peut-être d’excellentes idées sur la nature du problème, mais le monde réel s’avère souvent faire quelque chose de différent.Et optimiser la mauvaise partie du code signifie, au mieux, beaucoup de travail pour un bénéfice minime.Le plus souvent, cela ralentit les choses, et parfois cela les interrompt complètement.Ainsi, avant d'effectuer des modifications dans un souci d'optimisation, vous devez toujours avoir des preuves réelles provenant d’un profileur ou d’un autre outil précis.

Comme mentionné, JProfiler et YourKit sont tous deux assez bons et pas trop chers.La dernière fois que j'ai regardé, ils avaient tous les deux aussi des démos gratuites.

Par souci d'exhaustivité :même si mon entreprise standardise plus ou moins Eclipse, nous utilisons Netbeans (6 et plus) avec son inclus, profileur gratuit sur une base quotidienne.Il fonctionne mieux que le plugin Eclipse TPTP (vérifié pour la dernière fois il y a 3 mois) et pour nous, il supprime tout besoin d'un profileur commercial tel que JProfiler, qui est excellent, mais devient rapidement inutile.

VisualVM devrait être le profileur de netbeans de manière autonome.J'ai essayé le TPTP pour Eclipse mais visualVm semble être une option bien plus intéressante !

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