JVMTI ou java.lang.instrument ?

JVMTI (JVM Tool Interface) est une interface de programmation qui fournit une API permettant d’inspecter l’état ou contrôler l’exécution d’application développée en Java. Cette API est apparue à partir de la JVM 1.5 et succède à JVMPI (JVM Programming Interface) introduit dans la version 1.4.

Elle fournit un moyen d’accès à un grand nombre d’informations sur le fonctionnement de la machine virtuelle java. L’API permet également d’interagir avec la JVM. Elle a été principalement conçue pour des outils ayant besoin d’introspecter le fonctionnement de la JVM tel que des profiler, des debugger, des outils de monitoring, etc.

Les outils utilisant cette API sont généralement appelés des agents. Ces agents s’abonnent à des évènements et en retour peuvent interagir avec l’application. Les agents s’exécutent dans le même processus que celui de l’application qu’ils instrumentent. Ils sont généralement développés en C ou C++. Dynatrace est une solution APM (Application Monitoring Management) qui s’appuie sur cette interface.

Par ailleurs, le package java.lang.instrument fournit une API java pour développer des agents et instrumenter des applications fonctionnant dans une JVM. L’interface Intrumentation fournit les services nécessaires pour instrumenter une application. L’instrumentation ne peut consister qu’en un ajout de byte-code, il ne peut pas y avoir de modification de l’état de l’application ou de son comportement. L’interface ClassFileTransformer est nécessaire pour modifier le byte-code avant que la classe ne soit chargée par la JVM. Les implémentations des classes « transformer » reposent généralement sur des API telles que BCI, javassist, BCEL, ASM, … etc. A noter que certains APM tel que AppDynamics utilisent l’API java.lang.instrument. Elle offre donc des possibilités avancées de monitoring.

Alors quelle solution choisir pour instrumenter une application java?

La réponse dépend essentiellement de votre besoin. En effet, en optant pour le développement java avec le package java.lang.Instrument vous ne pourrez pas facilement (ou pas du tout) déterminer des points de contentions de votre application, calculer le temps cpu consommé par un thread ou une méthode, et probablement d’autres fonctionnalités. Toutes ces fonctions, peuvent s’avérer très utiles lorsqu’on a besoin d’auditer en profondeur le fonctionnement d’une application ou d’une JVM.

Lorsque nous avons choisi de développer notre solution d’audit/supervision, nous avons opté pour l’API JVMTI. Je vous concède que c’est un choix que j’ai parfois regretté surtout au début de l’implémentation mais maintenant que les langages (C, JVMTI) sont devenus plus familiers, je me rend compte que ce choix, nous permet d’avoir une profondeur d’analyse très appréciable.

www.jperf.com

 

Publicités

A propos jlerbsc

founder of JavaPerf Consulting Http://www.jperf.com
Cet article a été publié dans JVMTI. Ajoutez ce permalien à vos favoris.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s