Java : analyser le heap d'une application

La version 1.6 de la JVM de Sun intègre un outil permettant d’analyser le heap d’une application : jhat. Etudions dans cet article ses différentes capacités.
jhat permet 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 une application et éviter des bugs de ce type :
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, un moteur JavaScript est à installer étant donné que celui installé par défaut par Apple est incompatible. Pour ce faire, téléchargez les deux archives suivantes :
JSR-223’s engines : https://scripting.dev.java.net/files/documents/4957/37593/jsr223-engines.zip
$ 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 devrait être détecté 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.
Un serveur local HTTP est disponible à l’adresse http://127.0.0.1:7000 et permet de consulter les résultats : nombre d’instances créées, histogramme de création, un query browser OQL qui permet de faire ses propres requêtes d’analyse. Ce dernier est à tester absolument.