Java : analyser le heap d’une application

Boris HUISGEN May 17, 2009

développement java jhat

La version 1.6 de la machine Java de Sun intégre un outil permettant d’analyser le heap d’une application : jhat. Il permet par exemple de vérifier quelles sont les instances vivantes des objets dans le heap, le nombre de créations d’instances pour un object donné, un historique de création …

Bref, un outil simple pour profiler un minimum son soft et éviter les messages de ce genre (c’est pour l’exemple) :

    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

En premier lieu sous Mac OS X, cet outil ne fonctionne pas out of the box, il faut installer un moteur JavaScript (celui d’Apple lance une exception au lancement de jhat). Pour installer un autre moteur JS, téléchargez les 2 archives suivantes :

    $ sudo cp ~/Desktop/jsr223-engines/javascript/build/js-engine.jar /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home/lib/ext/
    $ sudo cp ~/Desktop/rhino1_7R2/js.jar /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home/lib/ext/

Le nouveaux moteur JS Rhino doit à présent être listé par jrunscript :

    $ /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Commands/jrunscript -q
    Language EmbeddedECMAScript 1.6 implemention "Mozilla Rhino" 1.6 release 2
    Language AppleScript 2.0.1 implemention "AppleScriptEngine" 1.0
    Language ECMAScript 1.6 implemention "Mozilla Rhino" 1.6R7

Pour lancer l’analyse du heap d’une application, il est nécessaire de récupérer son PID par jps, pour le passer à jmap qui va dumper le heap dans un fichier. Une fois créé, on peut l’analyser avec jhat :

    $ /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Commands/jps
    22746 Jps
    22716 Application
    45737
    $ /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Commands/jmap -dump:format=b,file=dump.dat 22716
    Dumping heap to /Users/bhuisgen/dump.dat ...
    Heap dump file created
    $ /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Commands/jhat -J-Xmx512m dump.dat
    Reading from dump.dat...
    Dump file created Sun May 17 18:22:24 CEST 2009
    Snapshot read, resolving...
    Resolving 160010 objects...
    Chasing references, expect 32 dots................................
    Eliminating duplicate references................................
    Snapshot resolved.
    Started HTTP server on port 7000
    Server is ready.

Rendez-vous sur http://127.0.0.1:7000 pour consulter les résultats : nombres d’instances créées, histogramme de création, et un query browser OQL qui permet de faire ses propres requêtes d’analyse (à tester absolument).

See also

Java : analyse de code et détection de bugs
Read more
Java : loguer les exceptions avec un stacktrace
Read more
Java : options d’exécution de la JVM
Read more