Comment analyser un fichier .hprof?

227

J'ai un serveur de production fonctionnant avec l'indicateur suivant: - XX: + HeapDumpOnOutOfMemoryError

Hier soir, il a généré un fichier java-38942.hprof lorsque notre serveur a rencontré une erreur de segment de mémoire. Il s'avère que les développeurs du système connaissaient le drapeau mais aucun moyen d'en tirer des informations utiles.

Des idées?

Nick Stinemates
la source

Réponses:

215

Si vous voulez un outil assez avancé pour faire des recherches sérieuses, regardez le projet Memory Analyzer chez Eclipse, auquel SAP a contribué.

Une partie de ce que vous pouvez faire est incroyablement bonne pour trouver des fuites de mémoire, etc. - y compris exécuter une forme de SQL limité (OQL) contre les objets en mémoire, c'est-à-dire

SELECT toString (firstName) FROM com.yourcompany.somepackage.User

Totalement brillant.

Cowan
la source
18
Je voudrais juste ajouter un +100 pour l'analyseur de mémoire Eclipse. J'essaie actuellement de passer au crible un fichier de vidage de tas de 400 Mo et plus, et il a fallu plus de 70 minutes pour lire le fichier, avant qu'il ne provoque un crash complet de la JVM. L'EMA est capable de l'ouvrir en moins de 5 minutes.
mat b
3
Je continue à recevoir des erreurs d'analyse lors de l'ouverture de fichiers HPROF à l'aide de l'analyseur de mémoire Eclipse (qui ont en fait également été vidés par Eclipse!). Malheureux .. soupir.
lost_bits1110
3
MAT peut encore nécessiter un peu de RAM [moins que JHAT mais toujours pas mal]. Voir stackoverflow.com/questions/7254017/… pour des conseils si vous rencontrez cela.
rogerdpack
71

Vous pouvez utiliser JHAT , l'outil d'analyse de tas Java fourni par défaut avec le JDK. C'est la ligne de commande mais démarre un serveur / navigateur Web que vous utilisez pour examiner la mémoire. Pas le plus convivial, mais au moins il est déjà installé dans la plupart des endroits où vous irez. Une vue très utile est le lien "histogramme de tas" tout en bas.

ex: jhat -port 7401 -J-Xmx4G dump.hprof

jhat peut également exécuter OQL "ces jours-ci" (lien inférieur "exécuter OQL")

CMS
la source
Après avoir exécuté la commande ci-dessus Dans la console, vous obtiendrez le message dans le terminal "le serveur est prêt" Port: 7401. Après cela, ouvrez cette URL: localhost: 7401 "vous pouvez voir les détails dans les fenêtres du navigateur".
Laxman G
35

Vous pouvez également utiliser HeapWalker à partir du Netbeans Profiler ou de l' outil autonome Visual VM . Visual VM est une bonne alternative à JHAT car il est autonome, mais il est beaucoup plus facile à utiliser que JHAT.

Vous avez besoin de Java 6+ pour utiliser pleinement Visual VM.

James Schek
la source
Vous devez ajouter une note indiquant que cela concerne Java 6 et 7 uniquement.
Nick Stinemates
AFAIK, HeapWalker et VisualVM ne nécessitent pas Java 6/7 pour lire les fichiers HPROF.
James Schek
Je viens d'essayer de le charger avec Java 5 et il a dit 'Veuillez utiliser Java 6 ou 7' Que fais-je de mal?
Nick Stinemates,
Hmm. Vous devez peut-être exécuter Java 6, mais vous pouvez lire un HPROF Java 5 (c'est peut-être ainsi que je l'ai fait fonctionner). Je sais que vous ne pouvez pas créer un vidage de tas à partir de Visual VM sur une application exécutant Java 5. Mise à jour.
James Schek
Vous pouvez également utiliser JVM visuelle, de Java SDK - rechercher jvisualvm.exeau JAVASDK/bindossier
xxxvodnikxxx
11

Obtenez simplement l' analyseur de mémoire Eclipse . Il n'y a rien de mieux là-bas et c'est gratuit.

JHAT n'est utilisable que pour les "applications jouets"

kohlerm
la source
3
JHAT est nécessaire pour impressionner les hackers "l33t" qui fabriquent à la main une distribution BSD en commençant par le LILO. Attendez ... ils n'utiliseraient jamais java de toute façon. :-)
James Schek
Je pense que c'est plus un commentaire ...: \
rogerdpack
10

YourKit Java Profiler semble également les gérer.

Polaris
la source
5

Si vous souhaitez effectuer une analyse personnalisée de votre tas, alors il y a:

Cette bibliothèque est rapide mais vous devrez écrire votre code d'analyse en Java.

De la documentation:

  • Ne crée aucun fichier temporaire sur le disque pour traiter le vidage de tas
  • Peut fonctionner directement les vidages de tas compressés GZ
  • Notation HeapPath
Andrejs
la source
2

Personnellement, je préfère VisualVM. L'une des fonctionnalités que j'aime dans VisualVM est la comparaison de vidage de tas. Lorsque vous effectuez une analyse de vidage de tas, il existe différentes façons de déterminer la cause de l'accident. L'une des façons dont j'ai trouvé utile est de comparer les décharges en tas saines et malsaines.

Voici les étapes que vous pouvez suivre pour cela:

  1. Obtenir un vidage de tas d'OutOfMemoryError appelons-le "oome.hprof". Vous pouvez l'obtenir via le paramètre JVM HeapDumpOnOutOfMemoryError.
  2. Redémarrez l'application, laissez-la fonctionner pendant une grande (minutes / heures) en fonction de votre application. Obtenez un autre vidage de tas pendant que l'application est toujours en cours d'exécution. Appelons-le "Healthy.hprof".
  3. Vous pouvez ouvrir ces deux vidages dans VisualVM et faire une comparaison de vidage de tas. Vous pouvez le faire au niveau de la classe ou du package. Cela peut souvent vous orienter dans la direction du problème.

lien: https://visualvm.github.io

Waleed
la source