JEP 451, Prepare to Disallow the Dynamic Loading of Agents

Contexte

Les agents Java existent depuis le JDK 5. L’idée des agents est de faire de l’instrumentation de code (via l’API java.lang.instrument). L’usage courant est celui des profileurs. Via l’agent, ils vont pouvoir calculer le temps passé dans les méthodes par exemple.

La possibilité d’attacher un agent vient avec le JDK 6 et l’API Attach (API non officielle mais supportée). Cela permet l’utilisation d’outil comme jconsole ou jcmd.

Objectif

Ces agents ont des supers pouvoirs, vis à vis de la JVM, par l’instrumentation, ou la programmation par aspect. Selon le cas, cela peut altérer le comportement normale de l’application.

C’est pourquoi, afin de garantir l’intégrité de l’application, le chargement de l’agent sera désactivé par défaut dans des prochaines versions.

L’objectif n’est pas de supprimer cette fonctionnalité mais qu’elle soit controlée :

  • soit via le chargement au démarrage de la JVM

  • soit via le chargement dynamique mais autorisé de manière explicite.

Pour l’heure, l’objectif est de préparer ce changement par la sortie d’un avertissement quand le chargement dynamique a lieu mais qu’elle n’a pas été autorisée. Donc, pas de blocage pour l’instant.

Si un agent est chargé dynamiquement, l’avertissement suivant sera affiché.

WARNING: A {Java,JVM TI} agent has been loaded dynamically (file:/u/bob/agent.jar)
WARNING: If a serviceability tool is in use, please run with -XX:+EnableDynamicAgentLoading to hide this warning
WARNING: If a serviceability tool is not in use, please run with -Djdk.instrument.traceUsage for more information
WARNING: Dynamic loading of agents will be disallowed by default in a future release

Si l’option -XX:+EnableDynamicAgentLoading est utilisé, il n’y aura pas d’avertissement.

Donc si vous utilisez le chargement dynanique, pour bien préparer le prochain changement à ce niveau, pensez à rajouter cette option. Vous n’aurez plus de message et lorsque le chargement dynamique sera désactivé par défaut, vous n’aurez rien à faire.

Histoire

Cette proposition existe depuis la construction du JDK 9 (en 2017) lors de l’ajout des modules.

Seulement, par consensus, il a été décidé de reporter cette proposition à plus tard. Le but est que les mainteneurs des outils puissent s’adapter vis à vis de ce changement.

Cela avance et l’ajout de l’avertissement en cas d’usage permet de faciliter la transition.