J'ai un serveur de production en cours d'exécution avec l'indicateur suivant: -XX: + HeapDumpOnOutOfMemoryError
La nuit dernière, il a généré un fichier Java-38942.hprof lorsque notre serveur a rencontré une erreur de tas. Il s’avère que les développeurs du système connaissaient le drapeau mais n’avaient aucun moyen d’obtenir des informations utiles.
Des idées?
Si vous voulez un outil assez avancé pour faire des recherches sérieuses, jetez un œil à projet Memory Analyzer chez Eclipse, auquel SAP a contribué.
Certaines des choses que vous pouvez faire sont incroyablement bonnes pour trouver des fuites de mémoire, etc. - y compris exécuter une forme de SQL limité (OQL) sur les objets en mémoire, c.-à-d.
SELECT toString (firstName) FROM com.yourcompany.somepackage.User
Totalement brillant.
Vous pouvez utiliser JHAT , l'outil d'analyse de tas Java fourni par défaut avec le JDK. C'est en ligne de commande mais démarre un serveur Web/navigateur 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 du bas "exécuter OQL")
Vous pouvez également utiliser HeapWalker à partir de Netbeans Profiler ou de l'outil Visual VM autonome. Visual VM est une bonne alternative à JHAT car il est autonome, mais est beaucoup plus facile à utiliser que JHAT.
Vous avez besoin de Java 6+ pour utiliser pleinement Visual VM.
Obtenez juste le analyseur de mémoire Eclipse . Il n'y a rien de mieux et c'est gratuit.
JHAT est uniquement utilisable pour les "applications de jouets"
YourKit Java Profiler semble les gérer également.
Si vous voulez faire une analyse personnalisée de votre heapdump, alors il y a:
Cette bibliothèque est rapide mais vous devrez écrire votre code d'analyse en Java.
De la docs: