synthèse de gestionnaires mémoire pour applications java...

130
Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées Guillaume Salagnac Laboratoire Verimag / Université Joseph Fourier - Grenoble I 10 avril 2008

Upload: vodung

Post on 11-Sep-2018

216 views

Category:

Documents


0 download

TRANSCRIPT

Synthèse de gestionnaires mémoire pourapplications Java temps-réel embarquées

Guillaume Salagnac

Laboratoire Verimag / Université Joseph Fourier - Grenoble I

10 avril 2008

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Les systèmes embarqués/temps-réel

de plus en plus répandus

matériel hétérogèneressources limitéescontraintes fortes

fiabilité / sécuritétemps-réel

coûts de production élevés

I besoin de technologies standard

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 2 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Java pour l’embarqué/temps-réel

Langage attrayant...

Machine Virtuelle Java

Pilotes

Mat

érie

lLo

gici

el

(CPU, mémoire...)Matériel

Applicationfacilité de programmation

riche bibliothèque standardgestion automatique de la mémoire

portabilitécompacité du code exécutable

... mais peu utilisé dans l’embarqué/temps-réelplusieurs «variantes embarquées» incompatiblesproblèmes d’implémentation

comportement temporel imprévisible du ramasse-miettes(Garbage Collector, GC)

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 3 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Notre approche

Problème :Temps de pause non prévisibles du ramasse-miettes Java

Proposition :garder le langage Java Standard

pas de gestion manuelle de la mémoire

changer la machine virtuelleremplacer le ramasse-miettes par un allocateur prévisible

gestionnaire mémoire en régionscalculer les durées de vie des objets à l’avance

analyse statique du programme

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 4 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Plan

1 Introduction

2 Contexte : la gestion mémoire

3 Analyse d’interférence de pointeurs

4 Résultats expérimentaux

5 Conclusion

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 5 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

La gestion mémoire

Objectif :satisfaire les besoins en espace mémoire de l’application

Gestion manuelle :interface : allouer() et désallouer()

I risques d’erreur !

Gestion automatique :interface : seulement allouer()

I recyclage transparent grâce au ramasse-miettes

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 6 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Ramasse-miettes à marquage-balayage [McCarthy, 1960]

L’application s’exécute tant qu’il y a de la mémoire

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 7 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Ramasse-miettes à marquage-balayage [McCarthy, 1960]

L’application s’exécute tant qu’il y a de la mémoire

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 7 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Ramasse-miettes à marquage-balayage [McCarthy, 1960]

L’application s’exécute tant qu’il y a de la mémoire

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 7 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Ramasse-miettes à marquage-balayage [McCarthy, 1960]

L’application s’exécute tant qu’il y a de la mémoire

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 7 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Ramasse-miettes à marquage-balayage [McCarthy, 1960]

L’application s’exécute tant qu’il y a de la mémoire

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 7 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Ramasse-miettes à marquage-balayage [McCarthy, 1960]

L’application s’exécute tant qu’il y a de la mémoire

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 7 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Ramasse-miettes à marquage-balayage [McCarthy, 1960]

L’application s’exécute tant qu’il y a de la mémoire

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 7 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Ramasse-miettes à marquage-balayage [McCarthy, 1960]

?

... mais on ne peut pas allouer indéfiniment !

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 7 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Ramasse-miettes à marquage-balayage [McCarthy, 1960]

Le ramasse-miettes se déclenche

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 7 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Ramasse-miettes à marquage-balayage [McCarthy, 1960]

Marquage de proche en proche des objets accessibles

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 7 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Ramasse-miettes à marquage-balayage [McCarthy, 1960]

Marquage de proche en proche des objets accessibles

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 7 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Ramasse-miettes à marquage-balayage [McCarthy, 1960]

Marquage de proche en proche des objets accessibles

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 7 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Ramasse-miettes à marquage-balayage [McCarthy, 1960]

... jusqu’à arriver à un point fixe

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 7 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Ramasse-miettes à marquage-balayage [McCarthy, 1960]

Désallocation des objets morts

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 7 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Ramasse-miettes à marquage-balayage [McCarthy, 1960]

Reprise de l’exécution...après un temps de pause imprévisible !

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 7 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Ramasse-miettes à comptage de références [Collins, 1960]

1

Le GC compte les références directes vers chaque objet

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 8 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Ramasse-miettes à comptage de références [Collins, 1960]

1 11

Le GC compte les références directes vers chaque objet

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 8 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Ramasse-miettes à comptage de références [Collins, 1960]

1 11

1

Le GC compte les références directes vers chaque objet

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 8 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Ramasse-miettes à comptage de références [Collins, 1960]

1 2

1

Le GC compte les références directes vers chaque objet

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 8 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Ramasse-miettes à comptage de références [Collins, 1960]

1 2

1 1

Le GC compte les références directes vers chaque objet

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 8 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Ramasse-miettes à comptage de références [Collins, 1960]

0 2

1 1

compteur = 0 =⇒ objet mort

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 8 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Ramasse-miettes à comptage de références [Collins, 1960]

11

0 1

mise à jour des compteurs...

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 8 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Ramasse-miettes à comptage de références [Collins, 1960]

0

1

...et désallocation en cascade

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 8 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Ramasse-miettes à comptage de références [Collins, 1960]

0

...et désallocation en cascade

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 8 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Ramasse-miettes à comptage de références [Collins, 1960]

...et désallocation en cascade

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 8 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Ramasse-miettes à comptage de références (2)

1 2

1 1

Mais que se passe-t-il s’il y a des cycles de références ?

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 9 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Ramasse-miettes à comptage de références (2)

1 2

2 1

Mais que se passe-t-il s’il y a des cycles de références ?

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 9 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Ramasse-miettes à comptage de références (2)

0 2

2 1

compteur = 0 =⇒ objet mort

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 9 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Ramasse-miettes à comptage de références (2)

11

1 1

... mais objet mort 6=⇒ compteur = 0 !

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 9 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

À retenir : ramasses-miettes

Techniques de recyclage automatique de l’espace inutilisé

Marquage-balayage :parcours exhaustif de la mémoiretemps de pause intempestifs

Comptage de références :naturellement incrémentalincapable de détecter les cycles morts !

I incompatibles avec l’embarqué/temps-réel

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 10 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Gestion mémoire en régions [Tofte, Talpin, 94]

v4v3v2v1 v1 v2 v3 v4

r1 r2

Une région = un ensemble d’objets désalloué d’un seul bloc

objets alloués côte à côterégion détruite d’un bloc

I temps de pause prévisible

mais...difficulté de programmation

quand créer et détruire les régions ?dans quelle région placer les objets ?

explosion des régionsG. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 11 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Gestion mémoire en régions : exemples

Variantes :

régions extensibles ou de taille fixée ?règles d’organisation entre régions ?

Utilisation manuelle :

sous forme de bibliothèque : memory pools Apacheau niveau langage : ScopedMemory RTSJ

Real-Time Specification for Java

Synthèse automatique de régions :

Standard ML [Tofte, Talpin, 94], Prolog [Makholm, 2000]

Java [Cherem, Rugina, 04], [Qin et al, 04]

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 12 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Gestion mémoire en régions : à retenir

Variantes :

régions extensibles ou de taille fixée ?règles d’organisation entre régions ?

Utilisation manuelle :

I difficulté de programmation

Synthèse automatique de régions :

I risque d’explosion des régions

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 12 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Plan

1 Introduction

2 Contexte : la gestion mémoire

3 Analyse d’interférence de pointeurs

4 Résultats expérimentaux

5 Conclusion

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 13 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Intégration dans le cycle de développement

sourceobservations

Implantation

exécutablecode

code

ExécutionCompilation

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 14 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Intégration dans le cycle de développement

sourceobservations

Implantation

exécutablecode

code

+annotations

Compilation

Analyse+ Exécution

enrégions

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 14 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Intégration dans le cycle de développement

sourceobservations

Implantation

exécutablecode

code

+annotations

Compilation

Analyse+ Exécution

enrégions

résultats

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 14 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Heuristique

Hypothèse générationnelle : [Hirzel, 2002]Des objets situés dans la même structure de données(connectés entre eux) ont souvent une durée de vie similaire

Idée :I une région pour chaque structure de données

pas de pointeur entre deux régions

Analyse statique :trouver les variables référençant des objets qui peuventêtre connectés (sur-approximation)

Politique d’allocation :placer les objets de façon à grouper chaque structure dansune région

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 15 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Analyse d’interférence de pointeurs

main()

{

ArrayList list =

new ArrayList ;

list.<init>(3) ;

Object o1=new Object ;

Object o2=new Object ;

list.add(o1) ;

o2 = null ;

...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{

this.index = 0 ;

tmp = new Object[capacity] ;

this.data = tmp ;

}

void add(Object o)

{

this.data[this.index] = o ;

this.index ++ ;

}

}

main()

list

o1

o2

<init>()

this

tmp

add()

this

o

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 16 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Analyse d’interférence de pointeurs

main()

{

ArrayList list =

new ArrayList ;

list.<init>(3) ;

Object o1=new Object ;

Object o2=new Object ;

list.add(o1) ;

o2 = null ;

...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{

this.index = 0 ;

tmp = new Object[capacity] ;

this.data = tmp ;

}

void add(Object o)

{

this.data[this.index] = o ;

this.index ++ ;

}

}

∀ méthodes,

main()

list

o1

o2

<init>()

this

tmp

add()

this

o

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 16 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Analyse d’interférence de pointeurs

main()

{

ArrayList list =

new ArrayList ;

list.<init>(3) ;

Object o1=new Object ;

Object o2=new Object ;

list.add(o1) ;

o2 = null ;

...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{

this.index = 0 ;

tmp = new Object[capacity] ;

this.data = tmp ;

}

void add(Object o)

{

this.data[this.index] = o ;

this.index ++ ;

}

}

∀ variables locales,

main()list

o1

o2

<init>()this

tmp

add()this

o

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 16 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Analyse d’interférence de pointeurs

main()

{

ArrayList list =

new ArrayList ;

list.<init>(3) ;

Object o1=new Object ;

Object o2=new Object ;

list.add(o1) ;

o2 = null ;

...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{

this.index = 0 ;

tmp = new Object[capacity] ;

this.data = tmp ;

}

void add(Object o)

{

this.data[this.index] = o ;

this.index ++ ;

}

}

règle 1)interférence locale :v1.f=v2 =⇒ v1∼v2

main()list

o1

o2

<init>()this ∼ tmp

add()this

o

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 16 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Analyse d’interférence de pointeurs

main()

{

ArrayList list =

new ArrayList ;

list.<init>(3) ;

Object o1=new Object ;

Object o2=new Object ;

list.add(o1) ;

o2 = null ;

...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{

this.index = 0 ;

tmp = new Object[capacity] ;

this.data = tmp ;

}

void add(Object o)

{

this.data[this.index] = o ;

this.index ++ ;

}

}

règle 1)interférence locale :v1.f=v2 =⇒ v1∼v2

main()list

o1

o2

<init>()this ∼ tmp

add()this ∼ o

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 16 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Analyse d’interférence de pointeurs

main()

{

ArrayList list =

new ArrayList ;

list.<init>(3) ;

Object o1=new Object ;

Object o2=new Object ;

list.add(o1) ;

o2 = null ;

...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{

this.index = 0 ;

tmp = new Object[capacity] ;

this.data = tmp ;

}

void add(Object o)

{

this.data[this.index] = o ;

this.index ++ ;

}

}

règle 2)propagation :p1∼p2 =⇒ a1∼a2

main()list ∼ o1

o2

<init>()this ∼ tmp

add()this ∼ o

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 16 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Analyse d’interférence de pointeurs

main()

{// list∼o1 o2

ArrayList list =

new ArrayList ;

list.<init>(3) ;

Object o1=new Object ;

Object o2=new Object ;

list.add(o1) ;

o2 = null ;

...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{// this∼tmpthis.index = 0 ;

tmp = new Object[capacity] ;

this.data = tmp ;

}

void add(Object o)

{// this∼othis.data[this.index] = o ;

this.index ++ ;

}

}

résultats :injectés dans le code

main()list ∼ o1

o2

<init>()this ∼ tmp

add()this ∼ o

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 16 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Politique d’allocation en régions

•main()

{// list∼o1 o2

ArrayList list =

new ArrayList ;

list.<init>(3) ;

Object o1=new Object ;

Object o2=new Object ;

list.add(o1) ;

o2 = null ;

...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{// this∼tmpthis.index = 0 ;

tmp = new Object[capacity] ;

this.data = tmp ;

}

void add(Object o)

{// this∼othis.data[this.index] = o ;

this.index ++ ;

}

}

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 17 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Politique d’allocation en régions

main()

{// list∼o1 o2

•ArrayList list =

new ArrayList ;

list.<init>(3) ;

Object o1=new Object ;

Object o2=new Object ;

list.add(o1) ;

o2 = null ;

...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{// this∼tmpthis.index = 0 ;

tmp = new Object[capacity] ;

this.data = tmp ;

}

void add(Object o)

{// this∼othis.data[this.index] = o ;

this.index ++ ;

}

}

list

o2

o1

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 17 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Politique d’allocation en régions

main()

{// list∼o1 o2

ArrayList list =

new ArrayList ;•list.<init>(3) ;

Object o1=new Object ;

Object o2=new Object ;

list.add(o1) ;

o2 = null ;

...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{// this∼tmpthis.index = 0 ;

tmp = new Object[capacity] ;

this.data = tmp ;

}

void add(Object o)

{// this∼othis.data[this.index] = o ;

this.index ++ ;

}

}

list

o2

o1

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 17 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Politique d’allocation en régions

main()

{// list∼o1 o2

ArrayList list =

new ArrayList ;

•list.<init>(3) ;

Object o1=new Object ;

Object o2=new Object ;

list.add(o1) ;

o2 = null ;

...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{// this∼tmpthis.index = 0 ;

tmp = new Object[capacity] ;

this.data = tmp ;

}

void add(Object o)

{// this∼othis.data[this.index] = o ;

this.index ++ ;

}

}

list

o2

o1

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 17 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Politique d’allocation en régions

main()

{// list∼o1 o2

ArrayList list =

new ArrayList ;

•list.<init>(3) ;

Object o1=new Object ;

Object o2=new Object ;

list.add(o1) ;

o2 = null ;

...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{// this∼tmp•this.index = 0 ;

tmp = new Object[capacity] ;

this.data = tmp ;

}

void add(Object o)

{// this∼othis.data[this.index] = o ;

this.index ++ ;

}

}

list

o2

o1

this

tmp

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 17 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Politique d’allocation en régions

main()

{// list∼o1 o2

ArrayList list =

new ArrayList ;

•list.<init>(3) ;

Object o1=new Object ;

Object o2=new Object ;

list.add(o1) ;

o2 = null ;

...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{// this∼tmpthis.index = 0 ;•tmp = new Object[capacity] ;

this.data = tmp ;

}

void add(Object o)

{// this∼othis.data[this.index] = o ;

this.index ++ ;

}

}

list

o2

o1

this

tmp

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 17 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Politique d’allocation en régions

main()

{// list∼o1 o2

ArrayList list =

new ArrayList ;

•list.<init>(3) ;

Object o1=new Object ;

Object o2=new Object ;

list.add(o1) ;

o2 = null ;

...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{// this∼tmpthis.index = 0 ;

•tmp = new Object[capacity] ;

this.data = tmp ;

}

void add(Object o)

{// this∼othis.data[this.index] = o ;

this.index ++ ;

}

}

list

o2

o1

this

tmp

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 17 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Politique d’allocation en régions

main()

{// list∼o1 o2

ArrayList list =

new ArrayList ;

•list.<init>(3) ;

Object o1=new Object ;

Object o2=new Object ;

list.add(o1) ;

o2 = null ;

...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{// this∼tmpthis.index = 0 ;

tmp = new Object[capacity] ;•this.data = tmp ;

}

void add(Object o)

{// this∼othis.data[this.index] = o ;

this.index ++ ;

}

}

list

o2

o1

this

tmp

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 17 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Politique d’allocation en régions

main()

{// list∼o1 o2

ArrayList list =

new ArrayList ;

•list.<init>(3) ;

Object o1=new Object ;

Object o2=new Object ;

list.add(o1) ;

o2 = null ;

...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{// this∼tmpthis.index = 0 ;

tmp = new Object[capacity] ;

•this.data = tmp ;

}

void add(Object o)

{// this∼othis.data[this.index] = o ;

this.index ++ ;

}

}

list

o2

o1

this

tmp

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 17 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Politique d’allocation en régions

main()

{// list∼o1 o2

ArrayList list =

new ArrayList ;

•list.<init>(3) ;

Object o1=new Object ;

Object o2=new Object ;

list.add(o1) ;

o2 = null ;

...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{// this∼tmpthis.index = 0 ;

tmp = new Object[capacity] ;

this.data = tmp ;•}

void add(Object o)

{// this∼othis.data[this.index] = o ;

this.index ++ ;

}

}

list

o2

o1

this

tmp

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 17 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Politique d’allocation en régions

main()

{// list∼o1 o2

ArrayList list =

new ArrayList ;

list.<init>(3) ;•

Object o1=new Object ;

Object o2=new Object ;

list.add(o1) ;

o2 = null ;

...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{// this∼tmpthis.index = 0 ;

tmp = new Object[capacity] ;

this.data = tmp ;

}

void add(Object o)

{// this∼othis.data[this.index] = o ;

this.index ++ ;

}

}

list

o2

o1

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 17 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Politique d’allocation en régions

main()

{// list∼o1 o2

ArrayList list =

new ArrayList ;

list.<init>(3) ;

•Object o1=new Object ;

Object o2=new Object ;

list.add(o1) ;

o2 = null ;

...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{// this∼tmpthis.index = 0 ;

tmp = new Object[capacity] ;

this.data = tmp ;

}

void add(Object o)

{// this∼othis.data[this.index] = o ;

this.index ++ ;

}

}

list

o2

o1

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 17 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Politique d’allocation en régions

main()

{// list∼o1 o2

ArrayList list =

new ArrayList ;

list.<init>(3) ;

Object o1=new Object ;•Object o2=new Object ;

list.add(o1) ;

o2 = null ;

...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{// this∼tmpthis.index = 0 ;

tmp = new Object[capacity] ;

this.data = tmp ;

}

void add(Object o)

{// this∼othis.data[this.index] = o ;

this.index ++ ;

}

}

list

o2

o1

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 17 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Politique d’allocation en régions

main()

{// list∼o1 o2

ArrayList list =

new ArrayList ;

list.<init>(3) ;

Object o1=new Object ;

•Object o2=new Object ;

list.add(o1) ;

o2 = null ;

...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{// this∼tmpthis.index = 0 ;

tmp = new Object[capacity] ;

this.data = tmp ;

}

void add(Object o)

{// this∼othis.data[this.index] = o ;

this.index ++ ;

}

}

list

o2

o1

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 17 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Politique d’allocation en régions

main()

{// list∼o1 o2

ArrayList list =

new ArrayList ;

list.<init>(3) ;

Object o1=new Object ;

Object o2=new Object ;•

list.add(o1) ;

o2 = null ;

...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{// this∼tmpthis.index = 0 ;

tmp = new Object[capacity] ;

this.data = tmp ;

}

void add(Object o)

{// this∼othis.data[this.index] = o ;

this.index ++ ;

}

}

list

o2

o1

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 17 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Politique d’allocation en régions

main()

{// list∼o1 o2

ArrayList list =

new ArrayList ;

list.<init>(3) ;

Object o1=new Object ;

Object o2=new Object ;

•list.add(o1) ;o2 = null ;

...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{// this∼tmpthis.index = 0 ;

tmp = new Object[capacity] ;

this.data = tmp ;

}

void add(Object o)

{// this∼othis.data[this.index] = o ;

this.index ++ ;

}

}

list

o2

o1

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 17 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Politique d’allocation en régions

main()

{// list∼o1 o2

ArrayList list =

new ArrayList ;

list.<init>(3) ;

Object o1=new Object ;

Object o2=new Object ;

•list.add(o1) ;o2 = null ;

...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{// this∼tmpthis.index = 0 ;

tmp = new Object[capacity] ;

this.data = tmp ;

}

void add(Object o)

{// this∼o•this.data[this.index] = o ;

this.index ++ ;

}

}

list

o2

o1

this

o

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 17 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Politique d’allocation en régions

main()

{// list∼o1 o2

ArrayList list =

new ArrayList ;

list.<init>(3) ;

Object o1=new Object ;

Object o2=new Object ;

•list.add(o1) ;o2 = null ;

...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{// this∼tmpthis.index = 0 ;

tmp = new Object[capacity] ;

this.data = tmp ;

}

void add(Object o)

{// this∼othis.data[this.index] = o ;•this.index ++ ;

}

}

list

o2

o1

this

o

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 17 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Politique d’allocation en régions

main()

{// list∼o1 o2

ArrayList list =

new ArrayList ;

list.<init>(3) ;

Object o1=new Object ;

Object o2=new Object ;

•list.add(o1) ;o2 = null ;

...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{// this∼tmpthis.index = 0 ;

tmp = new Object[capacity] ;

this.data = tmp ;

}

void add(Object o)

{// this∼othis.data[this.index] = o ;

•this.index ++ ;

}

}

list

o2

o1

this

o

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 17 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Politique d’allocation en régions

main()

{// list∼o1 o2

ArrayList list =

new ArrayList ;

list.<init>(3) ;

Object o1=new Object ;

Object o2=new Object ;

•list.add(o1) ;o2 = null ;

...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{// this∼tmpthis.index = 0 ;

tmp = new Object[capacity] ;

this.data = tmp ;

}

void add(Object o)

{// this∼othis.data[this.index] = o ;

this.index ++ ;•}

}

list

o2

o1

this

o

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 17 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Politique d’allocation en régions

main()

{// list∼o1 o2

ArrayList list =

new ArrayList ;

list.<init>(3) ;

Object o1=new Object ;

Object o2=new Object ;

list.add(o1) ;•o2 = null ;

...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{// this∼tmpthis.index = 0 ;

tmp = new Object[capacity] ;

this.data = tmp ;

}

void add(Object o)

{// this∼othis.data[this.index] = o ;

this.index ++ ;

}

}

list

o2

o1

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 17 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Politique d’allocation en régions

main()

{// list∼o1 o2

ArrayList list =

new ArrayList ;

list.<init>(3) ;

Object o1=new Object ;

Object o2=new Object ;

list.add(o1) ;

•o2 = null ;

...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{// this∼tmpthis.index = 0 ;

tmp = new Object[capacity] ;

this.data = tmp ;

}

void add(Object o)

{// this∼othis.data[this.index] = o ;

this.index ++ ;

}

}

list

o2

o1

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 17 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Politique d’allocation en régions

main()

{// list∼o1 o2

ArrayList list =

new ArrayList ;

list.<init>(3) ;

Object o1=new Object ;

Object o2=new Object ;

list.add(o1) ;

o2 = null ;•...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{// this∼tmpthis.index = 0 ;

tmp = new Object[capacity] ;

this.data = tmp ;

}

void add(Object o)

{// this∼othis.data[this.index] = o ;

this.index ++ ;

}

}

list

o2

o1

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 17 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Politique d’allocation en régions

main()

{// list∼o1 o2

ArrayList list =

new ArrayList ;

list.<init>(3) ;

Object o1=new Object ;

Object o2=new Object ;

list.add(o1) ;

o2 = null ;•...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{// this∼tmpthis.index = 0 ;

tmp = new Object[capacity] ;

this.data = tmp ;

}

void add(Object o)

{// this∼othis.data[this.index] = o ;

this.index ++ ;

}

}

list

o2

o1

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 17 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Politique d’allocation en régions

main()

{// list∼o1 o2

ArrayList list =

new ArrayList ;

list.<init>(3) ;

Object o1=new Object ;

Object o2=new Object ;

list.add(o1) ;

o2 = null ;

•...}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{// this∼tmpthis.index = 0 ;

tmp = new Object[capacity] ;

this.data = tmp ;

}

void add(Object o)

{// this∼othis.data[this.index] = o ;

this.index ++ ;

}

}

list

o2

o1

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 17 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Politique d’allocation en régions

main()

{// list∼o1 o2

ArrayList list =

new ArrayList ;

list.<init>(3) ;

Object o1=new Object ;

Object o2=new Object ;

list.add(o1) ;

o2 = null ;

...•}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{// this∼tmpthis.index = 0 ;

tmp = new Object[capacity] ;

this.data = tmp ;

}

void add(Object o)

{// this∼othis.data[this.index] = o ;

this.index ++ ;

}

}

list

o2

o1

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 17 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Politique d’allocation en régions

main()

{// list∼o1 o2

ArrayList list =

new ArrayList ;

list.<init>(3) ;

Object o1=new Object ;

Object o2=new Object ;

list.add(o1) ;

o2 = null ;

...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{// this∼tmpthis.index = 0 ;

tmp = new Object[capacity] ;

this.data = tmp ;

}

void add(Object o)

{// this∼othis.data[this.index] = o ;

this.index ++ ;

}

}

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 17 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Politique d’allocation en régions

main()

{// list∼o1 o2

ArrayList list =

new ArrayList ;

list.<init>(3) ;

Object o1=new Object ;

Object o2=new Object ;

list.add(o1) ;

o2 = null ;

...

}

class ArrayList

{

Object[] data ;

int index ;

<init>(int capacity)

{// this∼tmpthis.index = 0 ;

tmp = new Object[capacity] ;

this.data = tmp ;

}

void add(Object o)

{// this∼othis.data[this.index] = o ;

this.index ++ ;

}

}

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 17 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Syndrome d’explosion de région

class RefObject

{

Object f ;

foo()

{

Object bar=new Object ;

this.f=bar ;

}

}

main()

{

RefObject r=new RefObject() ;

while(true)

{

r.foo() ;

}

}

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 18 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Syndrome d’explosion de région

class RefObject

{

Object f ;

foo()

{

Object bar=new Object ;

this.f=bar ;

}

}

main()

{

RefObject r=new RefObject() ;

while(true)

{

r.foo() ;

}

}

Analyse d’interférence depointeurs :

foo()this∼bar

main()r

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 18 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Syndrome d’explosion de région

class RefObject

{

Object f ;

foo()

{// this∼barObject bar=new Object ;

this.f=bar ;

}

}

main()

{

RefObject r=new RefObject() ;

while(true)

{

r.foo() ;

}

}

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 18 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Syndrome d’explosion de région

class RefObject

{

Object f ;

foo()

{// this∼barObject bar=new Object ;

this.f=bar ;

}

}

main()

{

RefObject r=new RefObject() ;

while(true)

{

r.foo() ;

}

}

r

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 18 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Syndrome d’explosion de région

class RefObject

{

Object f ;

foo()

{// this∼barObject bar=new Object ;

this.f=bar ;

}

}

main()

{

RefObject r=new RefObject() ;

while(true)

{

r.foo() ;

}

}

r

bar

this

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 18 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Syndrome d’explosion de région

class RefObject

{

Object f ;

foo()

{// this∼barObject bar=new Object ;

this.f=bar ;

}

}

main()

{

RefObject r=new RefObject() ;

while(true)

{

r.foo() ;

}

}

r

bar

this

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 18 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Syndrome d’explosion de région

class RefObject

{

Object f ;

foo()

{// this∼barObject bar=new Object ;

this.f=bar ;

}

}

main()

{

RefObject r=new RefObject() ;

while(true)

{

r.foo() ;

}

}

r

bar

this

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 18 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Syndrome d’explosion de région

class RefObject

{

Object f ;

foo()

{// this∼barObject bar=new Object ;

this.f=bar ;

}

}

main()

{

RefObject r=new RefObject() ;

while(true)

{

r.foo() ;

}

}

r

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 18 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Syndrome d’explosion de région

class RefObject

{

Object f ;

foo()

{// this∼barObject bar=new Object ;

this.f=bar ;

}

}

main()

{

RefObject r=new RefObject() ;

while(true)

{

r.foo() ;

}

}

r

bar

this

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 18 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Syndrome d’explosion de région

class RefObject

{

Object f ;

foo()

{// this∼barObject bar=new Object ;

this.f=bar ;

}

}

main()

{

RefObject r=new RefObject() ;

while(true)

{

r.foo() ;

}

}

r

bar

this

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 18 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Syndrome d’explosion de région

class RefObject

{

Object f ;

foo()

{// this∼barObject bar=new Object ;

this.f=bar ;

}

}

main()

{

RefObject r=new RefObject() ;

while(true)

{

r.foo() ;

}

}

r

this

bar

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 18 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Syndrome d’explosion de région

class RefObject

{

Object f ;

foo()

{// this∼barObject bar=new Object ;

this.f=bar ;

}

}

main()

{

RefObject r=new RefObject() ;

while(true)

{

r.foo() ;

}

}

r

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 18 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Syndrome d’explosion de région

class RefObject

{

Object f ;

foo()

{// this∼barObject bar=new Object ;

this.f=bar ;

}

}

main()

{

RefObject r=new RefObject() ;

while(true)

{

r.foo() ;

}

}

r

this

bar

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 18 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Syndrome d’explosion de région

class RefObject

{

Object f ;

foo()

{// this∼barObject bar=new Object ;

this.f=bar ;

}

}

main()

{

RefObject r=new RefObject() ;

while(true)

{

r.foo() ;

}

}

r

bar

this

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 18 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Syndrome d’explosion de région

class RefObject

{

Object f ;

foo()

{// this∼barObject bar=new Object ;

this.f=bar ;

}

}

main()

{

RefObject r=new RefObject() ;

while(true)

{

r.foo() ;

}

}

r

bar

this

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 18 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Syndrome d’explosion de région

class RefObject

{

Object f ;

foo()

{// this∼barObject bar=new Object ;

this.f=bar ;

}

}

main()

{

RefObject r=new RefObject() ;

while(true)

{

r.foo() ;

}

}

r

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 18 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Syndrome d’explosion de région

class RefObject

{

Object f ;

foo()

{// this∼barObject bar=new Object ;

this.f=bar ;

}

}

main()

{

RefObject r=new RefObject() ;

while(true)

{

r.foo() ;

}

}

r

bar

this

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 18 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Syndrome d’explosion de région

class RefObject

{

Object f ;

foo()

{// this∼barObject bar=new Object ;

this.f=bar ;

}

}

main()

{

RefObject r=new RefObject() ;

while(true)

{

r.foo() ;

}

}

r

bar

this

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 18 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Syndrome d’explosion de région

class RefObject

{

Object f ;

foo()

{// this∼barObject bar=new Object ;

this.f=bar ;

}

}

main()

{

RefObject r=new RefObject() ;

while(true)

{

r.foo() ;

}

}

r

bar

this

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 18 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Syndrome d’explosion de région

class RefObject

{

Object f ;

foo()

{// this∼barObject bar=new Object ;

this.f=bar ;

}

}

main()

{

RefObject r=new RefObject() ;

while(true)

{

r.foo() ;

}

}

r

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 18 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Syndrome d’explosion de région

class RefObject

{

Object f ;

foo()

{// this∼barObject bar=new Object ;

this.f=bar ;

}

}

main()

{

RefObject r=new RefObject() ;

while(true)

{

r.foo() ;

}

}

r

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 18 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Analyse de comportement des régions

Principe :chercher des motifs à risque dans legraphe d’appel+interférence :

this∼bar

rmain()

foo()

loop

...et les signaler au programmeur :

example.java:7: Possible memory leak

calling context: example.java:17: r.foo() ;

Object bar=new Object ;

^

class RefObject

{

Object f ;

foo()

{// this∼barObject bar=new Object ;

this.f=bar ;

}

}

main()

{

RefObject r=new RefObject() ;

while(true)

{

r.foo() ;

}

}

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 19 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

À retenir : analyse de pointeurs

Deux nouveaux algorithmes d’analyse de pointeurs

Analyse d’interférence de pointeurs :détecter les connexions potentielles entre objets

Analyse de comportement des régions :anticiper les risques d’explosion de régions

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 20 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Plan

1 Introduction

2 Contexte : la gestion mémoire

3 Analyse d’interférence de pointeurs

4 Résultats expérimentaux

5 Conclusion

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 21 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

JITS : Java In The Small [Grimaud et al, Lille]

Spécialiseur

.class

Amorceur

Ramasse-miettes Visualisateur

Migreur

Placeur

JJVM

Gestionnaire

Machine Virtuelle

mémoire

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 22 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

JITS : Java In The Small [Grimaud et al, Lille]

Spécialiseur

.class

Amorceur

Ramasse-miettes Visualisateur

Migreur

Placeur

JJVM

Gestionnaire

Machine Virtuelle

en régions

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 22 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Protocole expérimental

Idée : comparer l’occupation mémoire à l’exécutionavec le ramasse-miettes par défaut (marquage-balayage)avec le gestionnaire mémoire en régions

Deux types de programmes :suite de programmes-témoins JOlden

algorithmes typiquesbeaucoup d’allocationdifférents comportements mémoire

étude de cas : le décodeur mp3 JLayerapplication réaliste pour un système embarqué/temps-réelcode de grande taille

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 23 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Résultats expérimentaux : JOlden (1)

0 1x107 2x107 3x107 4x107 5x107

Temps (instructions)

40 %

50 %

60 %

70 %

80 %

90 %

100 %

Occ

upat

ion

de la

mém

oire

Ramasse-miettesSynthèse de régions

programme : Bisort

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 24 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Résultats expérimentaux : JOlden (1)

0 1x107 2x107 3x107 4x107 5x107

Temps (instructions)

40 %

50 %

60 %

70 %

80 %

90 %

100 %

Occ

upat

ion

de la

mém

oire

Ramasse-miettesSynthèse de régions

00.20.40.60.810

0.20.40.60.81

00.20.40.60.810

0.20.40.60.81

programme : Bisort

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 24 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Résultats expérimentaux : JOlden (2)

0 2x106 4x106 6x106 8x106 1x107 1.2x107

Temps (instructions)

40 %

50 %

60 %

70 %

80 %

90 %

100 %

Occ

upat

ion

de la

mém

oire

Ramasse-miettesSynthèse de régions

programme : BH

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 25 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Commentaire : JOlden

Des résultats variés :

1/3 des programmes : mieux que le GC1/3 des programmes : moins bien que le GC (explosion)1/3 des programmes : comportement similaire

I mais en tous cas, conformes à l’analyse de comportement

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 26 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Résultats expérimentaux : décodeur MP3

0 1x106 2x106 3x106 4x106 5x106 6x106 7x106

Temps (instructions)

40%

50%

60%

70%

80%

90%

100%

Occ

upat

ion

de la

mém

oire

Ramasse-miettesSynthèse de régions

programme : JLC

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 27 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Résultats expérimentaux : décodeur MP3

0 1x106 2x106 3x106 4x106 5x106 6x106 7x106

Temps (instructions)

40%

50%

60%

70%

80%

90%

100%

Occ

upat

ion

de la

mém

oire

Ramasse-miettesSynthèse de régions

programme : JLC

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 27 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Plan

1 Introduction

2 Contexte : la gestion mémoire

3 Analyse d’interférence de pointeurs

4 Résultats expérimentaux

5 Conclusion

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 28 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Bilan

Deux nouveaux algorithmes d’analyse de pointeurssynthèse de régions

comportement mémoire OK pour la plupart des programmesanticipation des explosions de région

résultats d’analyse intelligibles pour le programmeur

... assez rapides pour une utilisation interactive

Gestionnaire mémoire en régionscomportement temporel prévisible (temps constant)

I utilisable dans un contexte embarqué/temps-réel

Combinaison avec un ramasse-miettesgérer certaines régions par comptage de références

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 29 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Perspectives

Validation :d’autres expérimentationsd’autres études de cas

Implantation :inclusion dans un Environnement de Développement Intégréautomatiser la combinaison avec le comptage de référencesmeilleure intégration dans JITS

Développements théoriques :évaluation quantitative des explosionsanalyse de forme globale (présence de cycles)gestion de la concurrence

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 30 / 31

Introduction Gestion mémoire Analyse de pointeurs Expérimentations Conclusion

Merci de votre attention

Des questions ?

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 31 / 31

Régions RTSJ Analyse Régions+RefCount

Transparents supplémentaires

6 Gestion mémoire en régions

7 RTSJ : Real-Time Specification for Java

8 Analyse de comportement : exemple de fausse alerte

9 Combinaison avec un comptage de références

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 32 / 31

Régions RTSJ Analyse Régions+RefCount

Gestion mémoire en régions

r1v1

v2 r2

Modèle classique

allouer(taille)I renvoie une adresse

désallouer(adresse)

Modèle en régions

créer_région( · · · )allouer(taille,region)détruire_région(region)

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 33 / 31

Régions RTSJ Analyse Régions+RefCount

Real-Time Specification for Java (RTSJ)

Une extension temps-réel de Javalangage : de nouvelles APIJVM : de nouvelles garanties

Mémoire gérée en régionsde taille fixeorganisées en arbre

I nombreuses règles de programmation

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 34 / 31

Régions RTSJ Analyse Régions+RefCount

Real-Time Specification for Java (RTSJ)

Une extension temps-réel de Javalangage : de nouvelles APIJVM : de nouvelles garanties

Mémoire gérée en régionsde taille fixeorganisées en arbre

I nombreuses règles de programmation

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 34 / 31

Régions RTSJ Analyse Régions+RefCount

Difficulté de programmation : exemple

void runLoop()

{

while ( true )

{

... lire les entrées

... faire quelque chose

}

}

class RunLoopIteration implements Runnable

{

void run()

{

... lire les entrées

... faire quelque chose

}

}

void runLoop()

{

... fixer la taille de la région

memory = new LTMemory( init_sz, max_sz) ;

runLoop = new RunLoopIteration() ;

while ( true ) memory.enter( runLoop ) ;

}

Patron de conception «Scoped loop» [Pizlo et al, 2004]

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 35 / 31

Régions RTSJ Analyse Régions+RefCount

Exemple de fause alerte : le décodeur MP3

main()

{

player = new Player() ;

player.play("file.mp3") ;

}

class Player

{

play(String filename)

{

OutputBuffer output = null ;

File file = new File(filename) ;

Decoder decoder = new Decoder(file) ;

Bitstream stream = new Bitstream(file) ;

while( true ) {

if( output == null ) {

output = new OutputBuffer() ;

}

Frame frame=stream.readFrame() ;

if( frame == null )

break ;

decoder.decodeFrame(frame,output) ;

...

}

}

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 36 / 31

Régions RTSJ Analyse Régions+RefCount

Combinaison avec un comptage de références

Idée : gérer certaines régions avec un ramasse-miettes

I comportement prévisible du GC

I recyclage de l’espace : pas d’explosion

Comment ?

en plaçant certains objets dans unerégion spéciale

v1

v2

v3

v4

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 37 / 31

Régions RTSJ Analyse Régions+RefCount

Combinaison avec un comptage de références

Idée : gérer certaines régions avec un ramasse-miettes

I comportement prévisible du GC

I recyclage de l’espace : pas d’explosion

Comment ?

en plaçant certains objets dans unerégion spéciale

v1

v2

v3

v4

v51

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 37 / 31

Régions RTSJ Analyse Régions+RefCount

Combinaison avec un comptage de références

Idée : gérer certaines régions avec un ramasse-miettes

I comportement prévisible du GC

I recyclage de l’espace : pas d’explosion

Comment ?

en plaçant certains objets dans unerégion spéciale

v1

v2

v3

v4

v51

1

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 37 / 31

Régions RTSJ Analyse Régions+RefCount

Combinaison avec un comptage de références

Idée : gérer certaines régions avec un ramasse-miettes

I comportement prévisible du GC

I recyclage de l’espace : pas d’explosion

Comment ?

en plaçant certains objets dans unerégion spéciale

v1

v2

v3

v4

v51 1

0

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 37 / 31

Régions RTSJ Analyse Régions+RefCount

Combinaison avec un comptage de références

Idée : gérer certaines régions avec un ramasse-miettes

I comportement prévisible du GC

I recyclage de l’espace : pas d’explosion

Comment ?

en plaçant certains objets dans unerégion spéciale

v1

v2

v3

v4

v51 1

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 37 / 31

Régions RTSJ Analyse Régions+RefCount

Combinaison avec un comptage de références

Idée : gérer certaines régions avec un ramasse-miettes

I comportement prévisible du GC

I recyclage de l’espace : pas d’explosion

Comment ?

en plaçant certains objets dans unerégion spéciale

v1

v2

v3

v4

v51 0

1

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 37 / 31

Régions RTSJ Analyse Régions+RefCount

Combinaison avec un comptage de références

Idée : gérer certaines régions avec un ramasse-miettes

I comportement prévisible du GC

I recyclage de l’espace : pas d’explosion

Comment ?

en plaçant certains objets dans unerégion spéciale

v1

v2

v3

v4

v51

1

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 37 / 31

Régions RTSJ Analyse Régions+RefCount

Résultats : régions et comptage de références

0 2x106 4x106 6x106 8x106 1x107 1.2x107

Temps (instructions)

40 %

50 %

60 %

70 %

80 %

90 %

100 %

Occ

upat

ion

de la

mém

oire

Ramasse-miettesSynthèse de régionsSynthèse de régions et comptage de références

programme : BH

G. Salagnac Synthèse de gestionnaires mémoire pour applications Java temps-réel embarquées 38 / 31