Question

Quelqu'un at-il utilisé le gestionnaire de mémoire Eclipse pour détecter les fuites de mémoire dans les codes Java? Quelqu'un peut-il recommander un bon endroit pour rechercher des informations concernant l'utilisation du gestionnaire de mémoire? J'ai lu quelque chose en ligne, cela suggère que je dois laisser le programme s'exécuter jusqu'à ce qu'il se bloque (une erreur de mémoire insuffisante se produit), ce qui générera un rapport d'erreur. Ensuite, utilisez le gestionnaire de mémoire pour ouvrir ce rapport afin d’examiner où la fuite de mémoire peut se produire. Est-ce ainsi que tout le monde utilise le gestionnaire de mémoire?

Était-ce utile?

La solution

Bien que -XX: + HeapDumpOnOutOfMemoryError peut être utile, mon flux de travail actuel pour utiliser le gestionnaire de mémoire Eclipse est le suivant:

  1. Exécutez le programme normalement
  2. Attendez que la mémoire devienne incontrôlable.
  3. Exécutez jmap : jmap -dump: format = b, fichier = dump.hprof < PID >
  4. Ouvrez le fichier hprof dans EMM.

Je commence généralement à travailler avec les vues de l'histogramme et de l'arborescence dominateur pour voir si quelque chose ne semble pas anormal, puis effectuez une exploration à partir de là.

VisualVM peut être utile, mais semble beaucoup moins efficace que EMM lorsque vous utilisez un vidage de tas (EMM met en cache beaucoup d’informations sur le chargement du vidage de tas). Netbeans Profiler est utile pour obtenir les emplacements des allocations et pour établir un profil de temps.

Autres conseils

La solution la plus simple consiste peut-être à exécuter votre programme sous HProf . (est fourni en standard avec la machine virtuelle) pendant un certain temps et force une sortie. La sortie de HProf devrait, espérons-le, vous donner des indications immédiates. votre fuite de mémoire.

Contrairement au débogueur de mémoire Eclipse (que je ne connais que par ce que vous écrivez), vous pouvez collecter des statistiques à partir de n'importe quel moment de l'exécution.

  

cela suggère que je dois laisser le programme s'exécuter jusqu'à ce qu'il se bloque (une erreur de mémoire insuffisante se produit), ce qui générera un rapport d'erreur.

Je ne pense pas que cela soit vrai. Vous n'obtiendrez pas de fichier de vidage lorsqu'un OutOfMemoryError se produit (je parierais que l'auteur confond ce problème avec une sorte de bogue JVM qui un core dump à sauvegarder).

La meilleure procédure consiste à effectuer un vidage de tas à l'aide de jmap ; cela va exporter le contenu du tas dans un fichier binaire (généralement appelé fichier hprof). Ce fichier peut ensuite être analysé par n’importe quel nombre d’analyseurs:

  • jhat - Outil Sun qui analyse le fichier hprof, démarre un serveur Web intégré afin que vous puissiez analyser le tas via un navigateur Web / afficher des rapports. J'ai trouvé que c'est très lent pour les gros tas.
  • VisualVM - Débogage génial / outil de dépannage fourni avec le JDK. Entre autres choses, cela peut également être utilisé pour générer un vidage de tas de tout processus en cours d'exécution, ainsi qu'un vidage de thread. J'ai constaté qu'il était très lent de charger de gros fichiers hprof aussi bien.
  • Eclipse Memory Analyzer - Plug-in Eclipse pouvant générer des fichiers hprof.

Je recommanderais vivement d'utiliser le plug-in Eclipse, car il permet de charger très rapidement des dumps de tas volumineux (> 500 Mo) (en moins d'une minute), produit des rapports utiles, prend en charge un langage de requête avec une logique complexe, etc.

Cette page explique comment travailler avec jvm tas dumps. Jhat est un moyen plus simple, mais moins graphique, de travailler avec des tas, mais vous pouvez également charger les mêmes fichiers de vidage dans le gestionnaire de mémoire eclipse. Vous pouvez également obtenir des informations de jvisualvm, si vous utilisez un jvm (1.6) actuel.

Je préfère généralement le profilage d'applications utilisant NetBeans Profiler. Vous pouvez assez facilement voir quels objets fuient et où ils sont créés dans la plupart des cas. Il existe probablement plusieurs autres outils qui le feront également, mais je sais que le profileur NetBeans fonctionne bien et est facile à utiliser.

Vous pouvez essayer d’utiliser Jprobe . Vous pouvez surveiller votre application et examiner les objets au fur et à mesure de leur création. Cela vous aidera également à analyser les objets qui ne sont pas récupérés et qui vous indiqueront l’avancée.

Bien que ce ne soit pas gratuit, mais je me souviens que cela vient avec une licence d'évaluation, alors vérifiez-le.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top