Comment obtenir un vidage de profilage Java pour créer des graphiques flame sur Mac?


Je voudrais collecter des stacktraces à partir de mon application Java pour créer Graphes de flamme CPU pour le profilage.

Ceci est très similaire à cette question: Comment obtenir un vidage de pile complet du profileur dans chaque échantillon pour une utilisation dans le graphique de flamme? avec 2 différences:

  1. Je travaille avec du code Java et j'ai besoin de stacktraces Java
  2. Je travaille sur Mac (cela signifie qu'il n'y a pas de pref et AFAIK dtracesur OSX ne prend pas en charge l'extension jstack).

J'ai déjà essayé léger-java-profiler et Honnête profiler, et deux d'entre eux semblent ne pas fonctionner sur Mac. J'ai également essayé VisualVM , mais je n'ai pas pu l'obtenir pour produire les décharges stacktrace dont j'avais besoin.

La première priorité pour moi sont les graphiques de flamme générés à partir de stacktraces Java, mais avoir la pile d'appels native serait également génial, car cela me permettrait d'aborder les problèmes d'E/S (et peut-être même de générer des graphiques de flamme chaude/froide).

Author: rogerdpack, 2014-12-01

4 answers

J'ai créé 2 petits scripts shell basés sur la réponse de @cello. Ils génèrent graphes de flammes chaudes/froides.

Obtenez-les de cet essentiel .

Utilisation:

ps ax | grep java # find the PID of your process
./profile.sh 20402 stacks.txt
./gen.sh stacks.txt

Alternativement, pour mesurer l'application à partir du démarrage (dans ce cas, ma construction gradle qui devait également être exécutée dans un autre répertoire et avec un flux d'entrée), j'ai utilisé:

cd ../my-project; ./gradlew --no-daemon clean build < /dev/zero &; cd -; ./profile.sh $! stacks.txt
./gen.sh stacks.txt

Résultats:

flamme graphiques

Dans cet exemple, je peux clairement voir que mon application est liée aux E / S (remarquez bleu les barres sur le dessus).

 3
Author: mik01aj, 2014-12-09 13:44:57

, Essayez ceci: https://github.com/saquibkhan/javaFlameGraph

Installation

npm install javaflamegraph

Utilisation

  1. cd javaflamegraph
  2. npm start - Cela attendra jusqu'à ce qu'il détecte un processus avec le nom 'Java'. Peut être mieux mieux utilisé pour commencer le profilage au programme démarrage.
  3. npm run start <process id> - Cela commencera à profiler pour l'id de processus donné. par exemple npm run start 1234
 2
Author: saquib khan, 2015-06-10 09:32:02

Avez-vous essayé la commande jstack? il suffit de l'exécuter sur la ligne de commande: jstack pidOfJavaProcess > stack.txt (naturellement, en remplaçant pidOfJavaProcess par le numéro de processus réel). Vous pouvez l'exécuter en boucle dans bash (le shell par défaut utilisé sur Mac OS X):

while true; do jstack pidOfJavaProcess >> stack.txt; sleep 1.0; done

Notez le >> à ajouter au fichier, et ne pas l'écraser chaque seconde. Appuyez sur Ctrl+C pour arrêter la journalisation des traces de pile.

Cela ne générera que les traces de la pile java, et non les piles d'appels natives de la JVM.

 2
Author: cello, 2018-08-29 16:12:20

Bonne nouvelle, le dépôt FlameGraph a "un script" pour travailler avec les jstacks déjà dedans.

Https://github.com/brendangregg/FlameGraph

C'est le stackcollapse-jstack.pl.

Il semble que par défaut, il n'attend que la trace de pile après la trace de pile dans son entrée, et compte chacun comme "un point d'échantillon."

Vous pouvez donc simplement faire plusieurs jstack dans un fichier (exécutez-le une ou plusieurs fois, ou une fois par seconde "pendant un certain temps", etc.):

jstack pid_of_your_jvm >> my_jstack

Puis exécutez cela script:

 ./stackcollapse-jstack.pl my_jstack > my_jstack.folded

Et enfin convertir en flamegraph:

 ./flamegraph.pl --color=java my_jstack.folded > my_jstack.svg

Aucun assistant tiers requis (bien qu'ils puissent toujours être utiles).

Notez également que le fichier stackcollapse-jstack.pl rejette les threads non EXÉCUTABLES, vous pouvez modifier cela si vous souhaitez également inclure des threads "inactifs" (généralement vous ne le faites pas).

Apparemment, vous pouvez utiliser la commande linux "perf" pour générer des piles pour un processus java, ainsi que, voir le README https://github.com/brendangregg/FlameGraph

Cela peut inclure plus d'appels natifs, par exemple.

 1
Author: rogerdpack, 2018-08-29 16:55:14