web-dev-qa-db-fra.com

Profilage d'application Java

Je suis à la recherche d'un profileur de code Java que je peux utiliser pour profiler mon application (c'est un service qui tourne en arrière-plan) en production (donc bas sur la tête, et il ne doit pas ralentir mon application). Je veux avant tout appeler le profilage de l’arbre d’appel, c’est-à-dire si a() appelle b() puis b() appelle c (), combien de temps a() b() et c() ont pris, inclusivement et exclusivement.

J'ai vu jvisualvm et jprofiler, mais ce n'est pas ce que je recherche, car je ne peux pas lier mon application de production à celle-ci car cela entraînerait un problème de performances majeur.

De plus, j’ai parcouru metrics ( https://github.com/dropwizard/metrics ), mais cela ne me donne pas une fonctionnalité permettant de profiler l’arbre des appels.

Callgrind ( http://valgrind.org/docs/manual/cl-manual.html ) La bibliothèque de types est ce dont j'ai besoin, car elle offre une fonctionnalité de profilage d'arborescence des appels et des options avancées permettant d'éviter les cycles d'appel (récursivité). Mais je ne suis pas sûr que Callgrind puisse être utilisé en production car il vide les données à la fin du programme.

Quelqu'un peut-il suggérer un bon profileur d'arborescence des appels pour Java pouvant être utilisé en production sans compromettre les performances?

14
Arry

Jetez un coup d’œil à Java Mission Control en conjonction avec Flight Recorder . À partir de la version d'Oracle JDK 7 Update 40 (7u40), Java Mission Control est fourni avec la machine virtuelle HotSpot, de sorte qu'il est hautement intégré et prétend avoir de légers effets sur les performances d'exécution. Je viens tout juste de commencer à l'examiner et je vois certaines fonctionnalités d'arborescence des appels.

enter image description here

12
kc2001

En général, vous n'avez pas (ou je ne recommanderai pas) les profileurs qui instrumentent votre application. L'instrumentation signifie toujours une surcharge de production incontrôlable.

Ce que vous pouvez utiliser est un profileur d'échantillonnage. Un profileur d'échantillonnage crée un instantané des traces de la pile à un intervalle contrôlable. Ce que vous ne recevez pas, c'est le nombre d'appels, mais après un certain temps d'exécution, vous obtenez une bonne vue d'ensemble des points chauds. Étant donné que vous pouvez ajuster l'intervalle d'échantillonnage du profileur, vous pouvez en influencer les coûts indirects.

Un profileur d’échantillonnage utilisable est livré avec le JDK, voir la page hprof dans la documentation de Java 7. ..__ Il existait auparavant des outils d’analyse graphique pour les traces hprof cpu (pas les traces de tas). Maintenant ils sont partis. Cependant, vous pouvez déjà travailler avec le fichier texte généré.

J'ai jeté un coup d'œil sur les éléments de Java Mission Control mentionnés ci-dessus. Je pense que c'est assez puissant pour satisfaire beaucoup de besoins, dans le livre blanc ils disent qu'il a seulement 2% de frais généraux. Cependant, ce n'est pas totalement ce dont j'ai personnellement besoin ou que je veux. Pour mes applications, il est préférable d’avoir un profilage "léger" activé tout le temps.

9
cruftex

Intel Amplifier XE http://software.intel.com/en-us/intel-vtune-amplifier-xe a des frais généraux minimes, le cas échéant. Il utilise la technologie d’échantillonnage de pile pour minimiser l’impact et peut s’associer à des processus en cours d’exécution en continu. Vous n'avez même pas besoin d'avoir des sources lors du profilage, vous pouvez plonger dans les sources plus tard après une navigation hors connexion des résultats de performances.

4
Andrew

Je ne connais aucun outil permettant de profiler sans impact sur les performances.

Vous pouvez ajouter la journalisation aux méthodes qui vous intéressent. Assurez-vous d'inclure l'horodatage dans le journal; alors vous pouvez faire le timing. Vous devez également configurer la structure de journalisation pour une journalisation asynchrone afin de réduire les pertes de performances.

Un tisserand au moment du chargement tel que AspectJ est capable d’ajouter ces appels au moment de l’exécution, ce qui vous permettrait de sélectionner facilement les méthodes que vous souhaitez surveiller sans modifier le code source à tout moment.

En utilisant un aspect around, vous pouvez même ajouter une journalisation de chronométrage, de sorte que vous n'avez pas à analyser les journaux et à rechercher les entrées de journal correspondantes. Voir ce blog pour plus de détails .

Jetez un coup d’œil à perfspy ( tutorial ), il est peut-être déjà prêt à utiliser ce dont vous avez besoin.

En relation:

1
Aaron Digulla