Jmap et jstack pour les débutants

Jmap et jstack pour les débutants
JMAP et JSTACK sont probablement les utilitaires les plus précieux dans la boîte à outils de tout développeur Java. Avec la fonctionnalité de ces deux outils combinés, vous pouvez déboguer les problèmes et exécuter des diagnostics pour le programme Java que vous codiez. En tant que paire d'outils de débogage la plus fondamentale, il est essentiel que vous sachiez comment travailler avec eux.

Ce sera un tutoriel sur les services publics JMAP et JSTACK en Java pour les débutants. Au moment où vous aurez terminé ce tutoriel, vous aurez une meilleure idée de la façon dont ces deux outils peuvent vous aider à résoudre et à déboguer.

Exécution de diagnostics avec JSTACK

JStack, en substance, est une utilité en ligne de commande utilisée dans le dépannage. Avec JStack, vous pouvez afficher les vidages de threads pour des programmes spécifiques, des processus ou des fichiers Java Core pour identifier les problèmes. Ceci, à son tour, révèle plus de détails tels que le nom complet de la classe, le nom de la méthode, le numéro de ligne de l'élément et l'index bytecode. JSTACK vous permet de voir quelle action chaque ligne de code prend lorsque vous exécutez le programme.

Diagnostics exécutif est ce pour quoi l'utilitaire JSTACK est le plus couramment utilisé. Vous appliquez la commande JSTACK à un fichier / processus de base spécifique, et il rapporte chaque thread lié à la JVM (threads VM interne inclus), ainsi que les cadres de pile d'origine. En plus de cela, JSTACK peut également identifier les chevauchements d'utilisation des ressources (impasses) pour dépanner le programme. Ces fonctionnalités permettent aux utilisateurs de supprimer la nécessité de s'appuyer sur tout autre utilitaire pour effectuer un diagnostic complet pour supprimer les bogues ou les erreurs du programme.

Conduire un dépotoir de pile

Si un programme ne répond pas, ou si un processus est bloqué, vous pouvez déterminer la racine exacte du problème en exécutant un dépotoir de pile. Il est particulièrement utile lorsque le jstack processId ne répond également pas, vous pouvez donc utiliser le commutateur -f à votre avantage.

Un vidage de pile typique doit ressembler au contenu ci-dessous:

Récupérer les traces à partir des décharges centrales

Si vous n'êtes pas familier avec les vidages de base, ce sont des vidages de mémoire qui conservent un journal pour les fichiers ou les programmes, documentant leur contenu et état à un certain moment, généralement lorsqu'un problème souffre d'un crash sans précédent. Les décharges de base sont assez flexibles en termes de contenu qu'ils peuvent détenir: et peuvent être rendues très détaillées pour des applications particulières.

Pour extraire les traces de pile à partir d'un vidage central, tapez la commande ci-dessous:

$ Jstack $ java_home / bin / java noyau

Pile mixte

Souvent, vous rencontrerez des erreurs trop grandes pour être identifiées avec des piles Java seules. C'est là que vous devrez tirer les cadres de pile native et voir ceux avec les piles Java. Les cadres natifs sont générés à l'aide de la langue C / C ++, et celles-ci peuvent être une bouée de sauvetage lorsqu'il s'agit d'exécuter des diagnostics.

Pour imprimer les piles natives, utilisez la commande -m comme illustré ci-dessous:


Identifier les fuites avec un utilitaire JMAP

En tant que développeur Java à venir (je suppose que vous êtes toujours novice, pourquoi seriez-vous sur un tutoriel JMAP?), vous exécuterez des diagnostics beaucoup plus souvent que vous ne le pensez. Les problèmes peuvent prendre la forme de l'encombrement de la mémoire, se manifestant comme un tas d'accumulation en continu qui ne disparaît pas aussi facile, ou peut-être comme un retard dans la libération d'une liste d'arroises.

Pour équilibrer ces décalages, vous allez d'abord identifier ces fuites avant de travailler pour les réparer. L'outil le plus puissant que vous ayez à votre disposition à cet égard est l'utilitaire JMAP. L'utilitaire JMAP atténue le problème en enregistrant la taille et le statut du tas d'accumulation.

C'est ainsi que vous utiliserez la commande JMAP lors de la sélection des fuites.

-Commande de tas

La commande -heap révèle des informations sur le tas en détail. Par exemple, vous pouvez acquérir des informations concernant les algorithmes GC, affinant des détails concernant chaque fil impliqué dans l'un de ses processus. Vous pouvez également voir les rapports d'utilisation du tas, et dans de nombreux détails également. JMAP révèlera des informations sur la capacité thermique et la mémoire actuellement disponible lorsqu'elle est invitée à générer des rapports de tas.

Histogramme de tas

Pour mieux visualiser les rapports que JMAP a présentés, un histogramme peut être créé. À cette fin, vous avez l'option -histo qui imprime l'histogramme pour un fichier de base du processeur Java. Lorsqu'il est appliqué à un processus en cours, vous verrez la taille de la mémoire en octets, combien d'objets les occupent, avec leurs noms de classe.

$ Jmap -histo \ / java / re / javase / 6 / dernier / binaires / solaris-sparc / bin / java noyau.27421

Avant de conclure:

Nous devons parler de Statistiques de génération permanente. En Java, la génération permanente fait partie du tas qui contient toute la nity-gritty de la machine virtuelle. Entre autres choses, il contient des détails sur la méthode et les objets de classe. Ces détails incluent le nombre exact de classes, le nombre d'octets en service à chaque chargeur de classe, l'adresse du chargeur de classe ainsi que l'adresse du chargeur de classe parent et une indication de savoir si le programme sera conservé ou envoyé aux ordures Collection plus tard.

En résumé

Maintenant que vous savez comment utiliser JSTACK et JMAP, vous avez deux des outils de dépannage les plus importants à votre disposition. Ce tutoriel a illustré comment vous pouvez identifier les racines des différents problèmes de votre programme en révélant les piles et les fils natifs. Nous avons également discuté de la façon de corriger les fuites de tas avec JMAP.

C'est tout pour cette leçon. Jusqu'à la prochaine fois.