Une proposition visant à promouvoir les traces de pile asynchrones dans Java progresse dans le processus d'amélioration de Java de l'OpenJDK. Appelé Asynchronous Stack Trace VM API, le projet consisterait à définir une API AsyncGetStackTrace pour collecter les traces de pile de manière asynchrone et inclure des données sur les trames de pile Java et natives. L’objectif est de fournir une API bien testée pour les profileurs, afin de délivrer des informations sur les cadres de pile natifs de Java, tout en supportant l'utilisation asynchrone, comme l'appel à partir d’un handler de signal.

Selon la proposition, les performances ne seraient pas affectées quand l'API n'est pas utilisée et les besoins en mémoire ne seraient pas notablement augmentés par rapport à l'API AsyncGetCallTrace existante. La prochaine API ne serait pas recommandée pour une utilisation en production, car elle pourrait faire planter la JVM. Le projet prévoit de minimiser les risques d'un tel incident sur la base de tests approfondis et de fuzzing.

Une simplification bienvenue

Actuellement, AsyncGetCallTrace est utilisé par la plupart des profileurs disponibles, tant open source que commerciaux, y compris async-profiler. Mais il présente deux inconvénients majeurs : d’abord, c’est une API interne qui n'est exportée dans aucun en-tête ; ensuite, elle ne renvoie que des informations sur les trames Java, à savoir leurs indices de méthode et de bytecode. Ces problèmes compliquent l'implémentation de profileurs et d'outils connexes. Même s’il était possible d’extraire des informations supplémentaires de la VM HotSpot par le biais d'un code complexe, d'autres informations utiles restent cachées. Par exemple, le fait de savoir si une trame Java compilée est inlined, ou de connaître le niveau de compilation d'une trame Java et des informations sur les trames C/C++ qui ne se trouvent pas en haut de la pile. Ces données peuvent s'avérer utiles pour le profilage et le réglage d'une VM pour une application donnée et pour le profilage de code faisant usage intensif de l’interface JNI (Java Native Interface).

L'API AsyncGetStackTrace serait calquée sur l'API AsyncGetCallTrace. La nouvelle API n'a pas encore été proposée pour une version spécifique de Java standard. La prochaine version kit de développement Java (JDK) 20 est attendue en mars 2023.