Normalement, ce que j'utilise est ParseHeapDump.sh
inclus dans Eclipse Memory Analyzer et décrit ici, et je le fais sur l'un de nos serveurs plus puissants (téléchargez et copiez le dossier .zip linux, décompressez là-bas). Le script shell nécessite moins de ressources que l'analyse de la mémoire à partir de l'interface graphique, plus vous pouvez l'exécuter sur votre serveur musclé avec plus de ressources (vous pouvez allouer plus de ressources en ajoutant quelque chose comme -vmargs -Xmx40g -XX:-UseGCOverheadLimit
à la fin de la dernière ligne du script. Par exemple, la dernière ligne de ce fichier pourrait ressembler à ceci après la modification
./MemoryAnalyzer -consolelog -application org.eclipse.mat.api.parse "$@" -vmargs -Xmx40g -XX:-UseGCOverheadLimit
Exécutez-le comme ./chemin/vers/ParseHeapDump.sh ../today_heap_dump/jvm.hprof
Après cela réussit, il crée un certain nombre de fichiers "index" à côté du fichier .hprof.
Après avoir créé les index, j'essaie de générer des rapports à partir de cela et de les copier sur mes machines locales pour voir si je peux trouver le coupable juste avec cela (pas seulement les rapports, pas les index). Voici un tutoriel sur la création des rapports.
Rapport d'exemple :
./ParseHeapDump.sh ../today_heap_dump/jvm.hprof org.eclipse.mat.api:suspects
Autres options de rapport :
org.eclipse.mat.api:overview
et org.eclipse.mat.api:top_components
Si ces rapports ne sont pas suffisants et si j'ai besoin de creuser plus (par exemple via oql), je transfère les index ainsi que le fichier hprof sur ma machine locale, puis j'ouvre le fichier de heap dump (avec les index dans le même répertoire que le fichier de heap dump) avec mon interface graphique Eclipse MAT. À partir de là, il n'a pas besoin de beaucoup de mémoire pour s'exécuter.
EDIT : Je voulais juste ajouter deux notes :
- D'après ce que je sais, seule la génération des index est la partie intensive en mémoire d'Eclipse MAT. Après avoir les index, la plupart de vos traitements avec Eclipse MAT n'auraient pas besoin de autant de mémoire.
- Le faire dans un script shell signifie que je peux le faire sur un serveur sans tête (et je le fais normalement sur un serveur sans tête également, car ce sont généralement les plus puissants). Et si vous avez un serveur qui peut générer un fichier de heap dump de cette taille, il est probable que vous ayez un autre serveur qui peut également traiter autant de heap dump.