Modélisation et analyse d'exécutions de programmes Java
Contexte :

Les programmes java, notamment par leur orientation objet et leur utilisation d'une machine virtuelle, posent de difficiles problèmes pour leur analyse et leur optimisation. Il est par exemple très difficile de savoir quelle sera la consommation mémoire d'un programme, simplement en analysant le code source, surtout à cause du mécanisme d'allocation dynamique (new). De plus, la libération mémoire est classiquement effectuée par le garbage collector, qui implémente une stratégie très conservative, où beaucoup d'objets restent longtemps en mémoire, bien qu'ils ne soient plus jamais accédés.

Afin d'analyser la réalité de l'utilisation des objets, on se base sur une (ou plusieurs) exécution du programme. Le programme est tout d'abord instrumenté, afin d'y insérer des instructions qui permettront de collecter des informations utiles sur cette exécution. Pour cela, on utilise un outil de profiling adapté aux programmes Java et à l'utilisation d'une machine virtuelle. On utilise pour cela l'outil Javana. L'exécution du programme instrumenté provoque alors la génération d'une trace d'exécution, c'est-à-dire d'un fichier contenant les informations collectées. C'est à partir de cette trace que l'on pourra déterminer a posteriori quelles ont été les créations et utilisations d'objets, et quelle a été la consommation mémoire. Mais l'objectif est également de construire une représentation expressive du comportement du programme à l'exécution, à travers un modèle de représentation.

Le modèle de représentation que l'on utilise a été développé à l'ICPS, et appliqué aux programmes C et Fortran pour la modélisation du comportement mémoire. Ce modèle, implémenté sous la forme de l'outil logiciel NLR, consiste à représenter une trace de valeurs entières, ou de n-uplets de valeurs entières, par une suite de boucles imbriquées, où les valeurs sont calculées par des fonctions linéaires des indices de boucles. Nous avons montré, sur quelques exemples, que cette approche pouvait également être appliquée avantageusement à des traces d'exécution de programmes Java constituées de quadruplets de la forme (méthode, classe, objet, creation/accès).

Cette représentation sous forme de boucles permet ensuite d'effectuer des calculs de quantités symboliques intéressantes, telles que l'instant de dernier accès à un objet quelconque, la durée de vie d'un objet quelconque, ou la consommation mémoire à un certain instant de l'exécution. Tous ces calculs d'analyse peuvent être effectués automatiquement grâce à la modélisation en polyèdres des boucles représentant la trace. On peut alors utiliser des outils tels que la librairie PolyLib ou le solveur en nombres entiers PIP.

Travail à effectuer :
Compétences requises : langages C et Java, linux, gout pour la compilation et l'optimisation de programmes.

Encadrement : Philippe Clauss

Références bibliographiques :

Alain Ketterlin and Philippe Clauss, Prediction and Trace Compression of Data Access Addresses through Nested Loops Recognition, IEEE/ACM International Symposium on Code Generation and Optimization 2008, CGO 2008, Boston, Massachusetts, USA, April 6 - 9, 2008.

Maebe, J., Buytaert, D., Eeckhout, L., and De Bosschere, K. 2006. Javana: a system for building customized Java program analysis tools. In Proceedings of the 21st Annual ACM SIGPLAN Conference on Object-Oriented Programming Systems, Languages, and Applications (Portland, Oregon, USA, October 22 - 26, 2006). OOPSLA '06. ACM, New York, NY, 153-168.

Prendre contact avec Philippe Clauss (clauss@icps.u-strasbg.fr)

sujets de projets