Sun propose quelques outils pour monitorer la JVM : jstatd, jvmstat et visualGC. Cela reste rudimentaire par rapport à d'autres outils comme jconsole mais cela a le mérite d'exister! Le principal intérêt d'utiliser encore cet outil est qu'il fonctionne pour les vieilles JVM version 1.4! Cet outil n'est pas packagé directement dans le JDK. Voici comment mettre en place cette techno rapidement en Java 1.4, Java 5 ou Java 6 entre une machine linux sur laquelle réside l'application java à monitorer et un poste de travail windows ou linux :

1) jstatd

Pour avoir des statistiques JVM il faut d'abord démarrer le serveur jstatd sur la machine cible (ce serveur se nommera target pour la suite) . Le serveur jstatd fait partie des exécutables présents dans la JVM. Il doit être démarré sous le même utilisateur que votre JVM. Si votre JVM a été installée en root vous devrez démarrer jstatd en root (par contre attention à la sécurité), sinon vous risquez d'avoir une exception de la part du SecurityManager.

D'autre part, il faut autoriser l'accès à la librairie tools.jar pour ne pas avoir d'exceptions de sécurité. Il faut créer un fichier que l'on appellera par exemple jstatd.all.policy que l'on peut mettre où l'on souhaite (généralement les fichiers de policy java sont dans $JAVA_HOME/jre/lib/security) :
grant codebase "file:${java.home}/../lib/tools.jar" {
    permission java.security.AllPermission;
};

On peut affiner ce fichier ultérieurement pour limiter les accès à certains hôtes ou réseaux. Ensuite on démarre le serveur jstat de la façon suivante :
# jstatd -p 8888 -J-Djava.security.policy=jstatd.all.policy &
Il va créer automatiquement un serveur RMI sur le port 8888. S'il existe déjà un serveur RMI n'indiquez pas de port, il le trouvera automatiquement. S'il y a plusieurs registres RMI, spécifier le port sur lequel le registre existe déjà. Pour contrôler que le serveur jstatd est bien lancé :
# netstat -tlp | grep jstatd
Vous devriez avoir 1 processus comme suit avec une écoute sur le port 8888 :
tcp 0 0 *:47396 *:* LISTEN 11034/jstatd
tcp 0 0 *:8888 *:* LISTEN 11034/jstatd

cf. : documentation jstatd

2) jvmstat : installation

Télécharger et installer le paquet jvmstat-3_0.zip que l'on peut trouver sur le site de jvmstat
Il suffit de le décompresser, d'ajouter deux variables d'environnement pour votre utilisateur (typiquement dans ~/.bashrc) :
JVMSTAT_HOME=/mon/rep/install/jvmstat (ou JVMSTAT_HOME=C:\java\jvmstat sous windows)
et
JVMSTAT_JAVA_HOME=$JAVA_HOME (ou JVMSTAT_JAVA_HOME=%JAVA_HOME% sous windows)
et de modifier le PATH comme suit
PATH=$PATH:$JVMSTAT_HOME/bin (ou PATH=%PATH%;%JVMSTAT_HOME%\bat sous windows)

3) jps : ou un "ps" pour java

il existe l'outil jps qui permet de lister les identifiants de processus java qui s'exécutent sur un hôte distant.
$ jps -l target.mydomain.com:8888
11034 sun.tools.jstatd.Jstatd
16344 org.apache.catalina.startup.Bootstrap
24856 org.codehaus.plexus.classworlds.launcher.Launcher
28637 org.apache.catalina.startup.Bootstrap
12110 sun.tools.jps.Jps

4) VisualGC

Il ne reste plus qu'à lancer VisualGC :
$ visualgc 16344 @target.mydomain.com:8888 2000 &
ou
> visuagc.bat 16344 @target.mydomain.com:8888 2000 (sous windows)
Ce qui va interroger le serveur jstatd de la machine "target" en demandant les données toutes les 2000ms pour le processus 16344 (dans notre cas c'est un serveur Tomcat dont on reconnaitra la classe Bootstrap).
Vous devez alors obtenir trois fenêtres séparées comme ceci :
VisualGC

Il y a toujours mieux : jconsole propose une interface plus jolie...