L'article détaille les capacités d'instrumentation du bytecode dans async-profiler, un outil de profilage Java. Contrairement au profilage par échantillonnage qui fournit des données statistiques approximatives, l'instrumentation permet de tracer chaque appel de méthode spécifique avec une précision totale. Cette fonctionnalité, disponible depuis la version 1.7, permet de suivre n'importe quelle méthode Java, y compris les méthodes internes du JDK, et d'identifier précisément l'origine d'appels problématiques comme System.gc() ou les constructeurs d'OutOfMemoryError.

La fonctionnalité latency, ajoutée récemment, comble une lacune importante en permettant de mesurer la durée d'exécution de chaque appel de méthode instrumenté. En combinaison avec le format de sortie JFR, elle permet d'analyser chaque appel individuel dans JDK Mission Control avec des informations détaillées sur le timestamp, la durée et la stack trace. L'article montre comment utiliser des seuils de latence pour filtrer uniquement les appels les plus longs, comme dans le cas d'ArrayList.contains dépassant 50 microsecondes, révélant ainsi des problèmes de complexité algorithmique cachés.

L'impact sur les performances est soigneusement examiné : l'instrumentation ajoute seulement quelques nanosecondes par appel grâce à l'insertion de timestamps dans le bytecode, sans interférer avec la compilation JIT. Cependant, la collecte des stack traces pour les appels dépassant le seuil de latence représente le coût principal, nécessitant une configuration judicieuse des paramètres. L'article compare également cette approche avec JEP 520 du JDK 25, notant que la solution async-profiler offre une meilleure visibilité en incluant la méthode instrumentée dans la stack trace.