Profil de L'exécution du programme Java dans VisualVM

en Java profiling, il semble que toutes les routes (gratuites) mènent aujourd'hui au profileur VisualVM inclus avec JDK6. Il ressemble à un bon programme, et tout le monde vante comment vous pouvez "attacher à un processus en cours d'exécution" comme une caractéristique majeure. Le problème est que cela semble être la seule façon de l'utiliser sur un procédé local. Je veux pouvoir démarrer mon programme dans le profileur, et suivre son exécution complète .

j'ai essayé d'utiliser l'option -Xrunjdwp décrite dans comment profiler application startup avec visualvm , mais entre les deux méthodes de transport (mémoire partagée et serveur), ni l'un ni l'autre n'est utile pour moi. VisualVM ne semble pas avoir d'intégration avec la première, et VisualVM refuse de se connecter à localhost ou 127.0.0.1 , donc cette dernière n'est pas bonne non plus. J'ai aussi essayé d'insérer une simple lecture de System.in dans mon programme pour insérer une pause dans exécution, mais dans ce cas VisualVM bloque jusqu'à ce que la lecture soit terminée, et ne vous permet pas de commencer le profilage jusqu'à ce que l'exécution soit en cours. j'ai également essayé de regarder dans le plugin Eclipse mais le site web est plein de liens morts et le lanceur se plante juste avec un NullPointerException quand j'essaie de l'utiliser (cela peut ne plus être exact).

venant de C, cela ne semble pas être une tâche particulièrement difficile pour je. Suis-je raté quelque chose ou est-ce vraiment impossible? Je suis ouvert à toutes sortes de suggestions, y compris l'utilisation d'un profileur différent (également libre), et je ne suis pas opposé à la ligne de commande.

31
demandé sur Community 2011-08-17 20:15:56

4 réponses

envisager d'utiliser HPROF et l'ouverture du fichier de données avec un outil comme HPjmeter - ou juste la lecture du fichier texte résultant dans votre éditeur préféré.

Command used: javac -J-agentlib:hprof=heap=sites Hello.java

SITES BEGIN (ordered by live bytes) Fri Oct 22 11:52:24 2004
          percent          live          alloc'ed  stack class  rank   self  accum     bytes objs     bytes  objs trace name
    1 44.73% 44.73%   1161280 14516  1161280 14516 302032 java.util.zip.ZipEntry
    2  8.95% 53.67%    232256 14516   232256 14516 302033 com.sun.tools.javac.util.List
    3  5.06% 58.74%    131504    2    131504     2 301029 com.sun.tools.javac.util.Name[]
    4  5.05% 63.79%    131088    1    131088     1 301030 byte[]
    5  5.05% 68.84%    131072    1    131072     1 301710 byte[]

HPROF est capable de présenter l'utilisation de l'UC, de l'allocation de tas de statistiques, et surveiller les profils de contestation. En outre, il peut également signaler les vidages complets de tas et les états de tous les moniteurs et fils dans le Machine virtuelle Java.

19
répondu Amir Afghani 2013-10-01 18:00:14

la meilleure façon de résoudre ce problème sans modifier votre application, est de ne pas utiliser VisualVM du tout. En ce qui concerne les autres options gratuites, vous pouvez utiliser soit Eclipse TPTP ou le profileur Netbeans , ou tout ce qui vient avec votre IDE.

si vous pouvez modifier votre application, pour suspendre son état pendant que vous configurez le profileur dans VisualVM, il est tout à fait possible de le faire, en utilisant le plugin VisualVM Eclipse. Je ne sais pas pourquoi vous obtenez L'exception NullPointerException, puisque cela semble fonctionner sur mon poste de travail. Vous aurez besoin de configurer le plugin en fournissant le chemin vers le binaire jvisualvm et le chemin du JDK; ceci est fait en visitant la boîte de dialogue de configuration VisualVM à Windows -> Preferences -> Run/Debug - > Launch -> VisualVM Configuration (comme montré dans la capture d'écran ci-dessous).

Eclipse VisualVM plugin

Vous aurez également besoin de configurez votre application pour démarrer avec le lanceur VisualVM, au lieu du lanceur JDT par défaut.

tous les lancements d'application à partir D'Eclipse, se traduiront maintenant par le suivi VisualVM la nouvelle JVM locale automatiquement, à condition que VisualVM soit déjà en cours d'exécution. Si vous n'avez pas VisualVM en cours d'exécution, alors le plugin lancera VisualVM, mais il continuera également à exécuter L'application.

déduisant de la phrase précédente, il est évident que l'arrêt de l'application dans la méthode main() avant d'effectuer tout traitement est très utile. Mais, ce n'est pas la principale raison de la suspension de l'application. Apparemment, VisualVM ou son plugin Eclipse ne permet pas de démarrer automatiquement le CPU ou les profileurs de mémoire. Cela signifierait que ces profileurs devrait être lancé manuellement, nécessitant dès lors la nécessité de suspendre l'application.

en outre, il est intéressant de noter que l'ajout des drapeaux: -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y au démarrage de JVM ne vous aidera pas dans le cas de VisualVM, de suspendre l'application et de configurer les profileurs. Les options sont destinées à vous aider dans le cas de profileurs qui peuvent effectivement se connecter au port ouvert de la JVM, en utilisant le protocole JDFP. VisualVM n'utilise pas ce protocole et vous devrez donc vous connecter à L'application en utilisant JDB ou un débogueur distant; mais cela ne résoudra pas le problème associé à la configuration du profileur, comme VisualVM (au moins en tant que de Java 6 update 26) ne vous permet pas de configurer les profileurs sur un processus suspendu car il n'affiche tout simplement pas l'onglet profileur.

11
répondu Vineet Reynolds 2011-08-17 20:34:13

le conseil avec -Xrunjdwp est incorrect. Il permet simplement le débogueur et avec suspend=y il attend que le débogueur se fixe. Comme VisualVM n'est pas un débogueur, il ne vous aide pas. Toutefois, l'insertion de System.in ou Thread.sleep() interrompt le démarrage et permet à VisualVM de se fixer à votre application. Assurez-vous de lire profilage avec VisualVM 1 et profilage avec VisualVM 2 pour mieux comprendre les paramètres du profileur. Notez également que au lieu du profilage, Vous pouvez utiliser L'onglet "Sampler" dans VisualVM, qui est plus approprié pour le profilage entier exécution du programme java. Comme d'autres mentionné, vous pouvez également utiliser Netbeans Profiler, qui soutiennent directement le profilage du démarrage de l'application.

3
répondu Tomas Hurka 2011-08-18 07:04:22

C'est maintenant possible avec le plugin de profileur de démarrage à VisualVM.

3
répondu Alexander Torstling 2014-02-24 14:37:03