Mon équipe rencontre des difficultés lorsqu'elle essaie de prendre de bonnes sauvegardes de tas déclenchées par OutOfMemoryErrors. Pour des raisons spécifiques, nous prenons actuellement les vidages avec jmap appelé à partir d'un script bash au lieu d'utiliser l'indicateur HeapDumpOnOutOfMemoryError. Nous utilisons une machine virtuelle Java 1.6 64 bits avec une taille de tas d'environ 3 Go. Nos vidages de tas échouent 90% du temps (estimation approximative).
Y a-t-il quelque chose que nous pouvons faire pour améliorer nos chances d'obtenir un vidage de tas propre que nous pouvons utiliser pour résoudre les problèmes de mémoire? J'ai lu que jmap avait des problèmes majeurs dans Java 1.4 mais que ces problèmes devraient être principalement résolus maintenant.
la source
Réponses:
Quel est votre système d'exploitation? (Je ne peux pas ajouter de commentaires).
Pour Solaris, nous obtenons de meilleurs résultats en forçant d'abord un core dump (
gcore <pid>
) puis en attachant jmap au fichier core dump (jmap -heap:format=b <path to java bin> <path to core>
)gcore
est un utilitaire * nix pour générer une image d'un programme en cours d'exécution. Voir lien .la source
nous avons un JSP qui interroge ManagementFactory.getThreadMXBean () et produit un rapport. Peut ne pas être utile lorsque l'application est en panne, mais si vous interrogez toutes les minutes, vous aurez une idée de ce qui se passe.
Plus d'infos ici.
la source
vous pouvez surveiller votre application via jmx de l'extérieur. lorsque vous connaissez certaines mesures qui indiquent une sortie OutOfMemory, vous pouvez déclencher une exécution jmap avant que l'exception ne soit levée.
la source
Merci à tous pour vos suggestions.
Ce que nous avons fini par faire, c'est écrire un script pour surveiller activement les journaux de collecte des ordures. D'après notre expérience, les GC complets consécutifs précèdent presque toujours un MOO, de sorte que notre script détecte cet événement, supprime gracieusement le serveur du pool d'équilibrage de charge et force le vidage de tas. Cela a considérablement augmenté notre efficacité.
la source
C'est une question assez ancienne, mais je répondrai avec l'espoir que quelqu'un puisse trouver cela utile.
jmap a une option -F (forcer). Cela s'est avéré ne pas fonctionner aussi bien dans le passé pour moi. Si vous devez utiliser l'option -F, je vous recommande de spécifier également le répertoire java.io.tmp dans le cadre de la commande jmap. Il y avait un problème avec JVM version 1.6.22 où l'utilitaire jmap ne fonctionnait pas correctement en raison d'un paramètre de répertoire temporaire.
Vous pouvez également essayer de prendre un vidage de mémoire via gdb. Une fois que vous avez le noyau, jmap peut convertir le noyau en un vidage de tas.
la source