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 :
- génération de traces à partir de programmes Java issus de bancs d'essai, à l'aide de l'outil Javana
- modélisation en suites de boucles imbriquées à l'aide de l'outil NLR
- développement
d'un outil de calcul automatique de premier et dernier accès aux
objets, et de durées de vie des objets, par appels aux librairies PolyLib et PIP
- étude d'une extension de NLR à la constitution d'un modèle générique à n'importe quelle exécution d'un programme Java (entrées variables, etc).
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