2008-09-28 6 views
15

J'ai réussi à obtenir une «fuite» de mémoire dans une application Java que je suis en train de développer. Lors de l'exécution de ma suite de tests JUnit, je suis confronté à des exceptions de mémoire (java.lang.OutOfMemoryError).Comment puis-je voir ce qui est dans mon tas dans Java?

Quels outils puis-je utiliser pour examiner le tas de mon application java pour voir ce qui utilise tout mon tas afin que je puisse déterminer ce qui garde des références aux objets qui devraient être en mesure d'être collectés.

Répondre

23

VisualVM est inclus dans les versions les plus récentes de Java. Vous pouvez l'utiliser pour créer un vidage de tas et regarder les objets qu'il contient.

Vous pouvez également créer un commandine de heapdump en utilisant jmap (dans votre jdk/bin dir):

jmap -dump:format=b,file=heap.bin <pid> 

Vous pouvez même l'utiliser pour obtenir un histogramme rapide de tous les objets

jmap -histo <pid> 

Je peux recommander Eclipse Memory Analyzer (http://eclipse.org/mat) pour l'analyse avancée des décharges de tas. Il vous permet de savoir exactement pourquoi un objet ou un ensemble d'objets est vivant. Voici une entrée de blog qui vous montre ce que Memory Analyzer peut faire: http://dev.eclipse.org/blogs/memoryanalyzer/2008/05/27/automated-heap-dump-analysis-finding-memory-leaks-with-one-click/

+0

Visual VM et le profileur Netbeans vous permettent de faire les mêmes choses que EMA. –

+1

Je ne connais pas netbeans, mais je n'ai certainement pas trouvé 'le chemin le plus court vers gc root' dans visual vm. – Tom

+1

+1 pour EMA - sauveteur. –

0

Si vous utilisez un système qui prend en charge GTK, vous pouvez essayer d'utiliser JMP.

6

Si vous avez besoin quelque chose de gratuit, essayez VisualVM

D'après la description du projet :

VisualVM est un outil visuel intégrant des outils JDK en ligne de commande et des capacités de profilage léger. Conçu pour le développement et l'utilisation du temps de production.

0

Vous pouvez essayer le détecteur de fuite de mémoire qui fait partie de la suite d'outils JRockit Mission Control. Il vous permet d'inspecter le tas pendant que la JVM est en cours d'exécution. Vous n'avez pas besoin de prendre des instantanés tout le temps. Vous pouvez simplement vous connecter en ligne à la JVM, puis voir comment le tas change entre les garbage collection. Vous pouvez également inspecter des objets, suivre des références graphiquement et obtenir des traces de pile à partir de l'endroit où votre application est en train d'allouer des objets. Voici un résumé introduction.

L'outil est utilisable pour développement et vous pouvez le télécharger here.

1

Utilisez les Eclipse Memory Analyzer

Il n'y a pas d'autre outil que je suis au courant de tout outil qui se rapproche de ses fonctionnalités et de la performance et le prix (source libre et ouvert) lors de l'analyse des décharges de tas.

2

C'est une vieille question. Beaucoup de gens ont peut-être commencé à utiliser IntelliJ depuis sa réponse initiale. IntelliJ a un plugin qui peut montrer l'utilisation de la mémoire appelée JVM Debugger Memory View.

+0

Après avoir joué un peu avec différents outils, j'ai trouvé que IntelliJ avait aussi un [plugin pour VisualVM] (https://plugins.jetbrains.com/plugin/7115-visualvm-launcher) (mentionné dans une réponse différente). Cette combinaison a fini par fonctionner mieux pour moi. – mkasberg