Utilisation du paramètre HeapDumpOnOutOfMemoryError pour le vidage de tas pour JBoss

182

On m'a dit que je pouvais ajouter le -XX:+HeapDumpOnOutOfMemoryErrorparamètre à mes options de démarrage JVM à mon script de démarrage JBoss pour obtenir un vidage de tas lorsque nous obtenons une erreur de mémoire insuffisante dans notre application. Je me demandais où ces données sont vidées? S'agit-il uniquement de la console ou d'un fichier journal? Si c'est juste à la console, que faire si je ne suis pas connecté au serveur Unix via la console?

Dmitry Trunov
la source
1
C'est le dossier actuel, je suppose.
Valentin Tihomirov

Réponses:

246

Voici ce que la documentation d'Oracle a à dire:

Par défaut, le vidage du tas est créé dans un fichier appelé java_ pid .hprof dans le répertoire de travail de la VM, comme dans l'exemple ci-dessus. Vous pouvez spécifier un autre nom de fichier ou répertoire avec l' -XX:HeapDumpPath=option. Par exemple -XX:HeapDumpPath=/disk2/dumps , le vidage du tas sera généré dans le /disk2/dumps répertoire.

Matt Solnit
la source
16
Cela répertorie également toutes les options liées aux performances des VM: java.sun.com/javase/technologies/hotspot/…
Ravi Gupta
4
Important! Les indicateurs HeapDump sont disponibles uniquement à partir de Java 1.5.0_07.
rustyx
14
Il est également important de reconnaître que la JVM n'écrasera PAS un vidage de tas existant dans le HeapDumpPath, vous verrez quelque chose de similaire "Unable to create /tmp/java_pidpid.hprof: File exists"dans votre sortie standard. Assurez-vous de déplacer votre fichier de vidage hors du chemin de vidage pour dégager la voie pour tous les fichiers de vidage futurs; et utilisez l' <pid>espace réservé dans le nom de fichier pour augmenter l'entropie dans le nom de fichier.
Ben
1
C'était extrêmement utile. Il n'a fallu que quelques minutes pour trouver la fuite avec Eclipse Memory Analyzer.
Aron Lorincz
Que se passe-t-il si nous donnons un chemin vers un dossier qui n'existe pas dans le système? Va-t-il créer un dossier et pousser le vidage de la bosse dans ce dossier?
Vinit89
47

Vous pouvez afficher ce vidage à partir de la console UNIX.

Le chemin du vidage du tas sera fourni sous forme de variable juste après l'endroit où vous avez placé la variable mentionnée.

Par exemple:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${DOMAIN_HOME}/logs/mps"

Vous pouvez afficher le vidage à partir de la console sur le chemin mentionné.

Swaminathan Krishnamoorthi
la source
4

J'ai eu du mal à déchiffrer ce que l'on entend par "répertoire de travail de la VM". Dans mon exemple, j'utilisais le programme Java Service Wrapper pour exécuter un jar - les fichiers de vidage ont été créés dans le répertoire où j'avais placé le programme wrapper, par exemple c: \ myapp \ bin. La raison pour laquelle j'ai découvert cela est que les fichiers peuvent être assez volumineux et qu'ils ont rempli le disque dur avant que je découvre leur emplacement.

B5A7
la source
Votre répertoire de travail peut être trouvé via la commande pwdx <PID>. Faites d'abord un ps -ef | grep java, recherchez votre PID pour votre application java, puis exécutez pwdx <PID>. Il vous indiquera le répertoire de travail.
RCG
2

Si vous n'utilisez pas l'option "-XX: HeapDumpPath", dans le cas de JBoss EAP / As par défaut, le fichier de vidage de tas sera généré dans le répertoire "JBOSS_HOME / bin".

Swapnil Chaudhari
la source