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 :
– JSR-223’s engines : https://scripting.dev.java.net/files/documents/4957/37593/jsr223-engines.zip
– Rhino : http://www.mozilla.org/rhino/download.html

$ 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 @ 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).