LU2IN002
CYCLE DE VIE DES OBJETS GABAGE COLLECTOR
Vincent Guigue & Christophe Marsala
Cycle de vie : définition
Se placer du point de vue de l’objet:
(1) Instanciation
Constructeur new
(2) Usage
Invocation de méthodes
(3) Destruction
Garbage collector
(1) création d’une instance
(2) évolution de l’instance
(3) condition de destruction
(1) Instanciation
Coté fournisseur:
mise en route de l’objet Instanciation = constructeur = contrat d’initialisation des attributs
Coté client:
création d’une instance Instanciation = création d’une zone mémoire réservée à l’objet
1 // F i c h i e r P o i n t . j a v a
2 p u b l i c c l a s s P o i n t {
3 p r i v a t e d o u b l e x , y ;
4
5 p u b l i c P o i n t (d o u b l e x2 ,d o u b l e y2 ) {
6 x = x2 ;
7 y = y2 ;
8 }
9 }
1 // F i c h i e r T e s t P o i n t . j a v a
2 p u b l i c c l a s s T e s t P o i n t {
3 p u b l i c s t a t i c v o i d main
4 ( S t r i n g [ ] a r g s ) {
5 // a p p e l du c o n s t r u c t e u r
6 // a v e c d e s v a l e u r s c h o i s i e s
7 P o i n t p1 = new P o i n t ( 1 . , 2 . ) ;
8 }
9 }
double x = 1 double y = 2
Point
Point p1 La variable p1, de type Point, référence un
instance de Point dont les attributs ont
pour valeur 1 et 2.
(1) Instanciation
Coté fournisseur:
mise en route de l’objet Instanciation = constructeur = contrat d’initialisation des attributs
Coté client:
création d’une instance Instanciation = création d’une zone mémoire réservée à l’objet
1 // F i c h i e r P o i n t . j a v a
2 p u b l i c c l a s s P o i n t {
3 p r i v a t e d o u b l e x , y ;
4
5 p u b l i c P o i n t (d o u b l e x2 ,d o u b l e y2 ) {
6 x = x2 ;
7 y = y2 ;
8 }
9 }
1 // F i c h i e r T e s t P o i n t . j a v a
2 p u b l i c c l a s s T e s t P o i n t {
3 p u b l i c s t a t i c v o i d main
4 ( S t r i n g [ ] a r g s ) {
5 // a p p e l du c o n s t r u c t e u r
6 // a v e c d e s v a l e u r s c h o i s i e s
7 P o i n t p1 = new P o i n t ( 1 . , 2 . ) ;
8 }
9 }
La variable p1, de type Point, référence un
(2) Usage
le fournisseur développe et garantit le bon fonctionnement des méthodes pour utiliser l’objet correctement,
le client invoque les méthodes sur des objets pour les manipuler.
1 // F i c h i e r P o i n t . j a v a
2 p u b l i c c l a s s P o i n t {
3 p r i v a t e d o u b l e x , y ;
4 p u b l i c P o i n t (d o u b l e x2 ,d o u b l e y2 ) {
5 x = x2 ; y = y2 ;
6 }
7
8 p u b l i c v o i d move (d o u b l e dx ,
9 d o u b l e dy ) {
10 x += dx ; y += dy ;
11 }
12 . . .
13 }
1 // F i c h i e r T e s t P o i n t . j a v a
2 p u b l i c c l a s s T e s t P o i n t {
3 p u b l i c s t a t i c v o i d main
4 ( S t r i n g [ ] a r g s ) {
5 // a p p e l du c o n s t r u c t e u r
6 // a v e c d e s v a l e u r s c h o i s i e s
7 P o i n t p1 = new P o i n t ( 1 . , 2 . ) ;
8 p1 . move ( 2 . , 3 . ) ;
9 // p1 => [ x =3 , y =5]
10 }
11 }
(3) Destruction
1
Un objet est détruit lorsqu’il n’est plus référencé
2
La destruction est implicite (contrairement au C++) et traitée en tâche de fond (garbage collector)
Un objet peut être référencé plusieurs fois...
1 // F i c h i e r T e s t P o i n t . j a v a
2 p u b l i c c l a s s T e s t P o i n t {
3 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
4 // a p p e l du c o n s t r u c t e u r
5 // a v e c d e s v a l e u r s c h o i s i e s
6 P o i n t p1 = new P o i n t ( 1 . , 2 . ) ;
7 P o i n t p2 = p1 ;
8 }
9 }
double x = 1 double y = 2
Point Point p1
Point p2
mais quand est-il dé-référencé?
(3) Destruction
1
Un objet est détruit lorsqu’il n’est plus référencé
2
La destruction est implicite (contrairement au C++) et traitée en tâche de fond (garbage collector)
Un objet peut être référencé plusieurs fois...
1 // F i c h i e r T e s t P o i n t . j a v a
2 p u b l i c c l a s s T e s t P o i n t {
3 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
4 // a p p e l du c o n s t r u c t e u r
5 // a v e c d e s v a l e u r s c h o i s i e s
6 P o i n t p1 = new P o i n t ( 1 . , 2 . ) ;
7 P o i n t p2 = p1 ;
8 }
9 }
double x = 1 double y = 2
Point Point p1
Point p2
mais quand est-il dé-référencé?
Dé-référencement d’un objet
double x = 1 double y = 2
Point Point p1
Point p2 1
Dé-référencement explicite (usage de =)
1 // F i c h i e r T e s t P o i n t . j a v a
2 p u b l i c c l a s s T e s t P o i n t {
3 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
4 // a p p e l du c o n s t r u c t e u r a v e c d e s v a l e u r s c h o i s i e s
5 P o i n t p1 = new P o i n t ( 1 . , 2 . ) ; P o i n t p2 = p1 ;
6 // Dé−r e f e r e n c e m e n t de l ’ i n s t a n c e [ 1 , 2 ]
7 // e t r e f e r e n c e m e n t de l ’ i n s t a n c e [ 2 . 5 , 3 ]
8 p2 = new P o i n t ( 2 . 5 , 3 . ) ;
9 }
10 }
2
Dé-référencement implicite (logique de bloc,
destruction de variables ⇒ destruction de références)
1 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
2 {
3 P o i n t p1 = new P o i n t ( 1 , 2 ) ;
4 S y s t e m . o u t . p r i n t l n ( p1 ) ;
5 }
6 S y s t e m . o u t . p r i n t l n ( p1 ) ;
7 // ERREUR DE COMPILATION : p1 n ’ e x i s t e p l u s i c i !
8 }
double x = 1 double y = 2
Point Point p1
Dé-référencement d’un objet
1
Dé-référencement explicite (usage de =)
1 // F i c h i e r T e s t P o i n t . j a v a
2 p u b l i c c l a s s T e s t P o i n t {
3 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
4 // a p p e l du c o n s t r u c t e u r a v e c d e s v a l e u r s c h o i s i e s
5 P o i n t p1 = new P o i n t ( 1 . , 2 . ) ; P o i n t p2 = p1 ;
6 // Dé−r e f e r e n c e m e n t de l ’ i n s t a n c e [ 1 , 2 ]
7 // e t r e f e r e n c e m e n t de l ’ i n s t a n c e [ 2 . 5 , 3 ]
8 p2 = new P o i n t ( 2 . 5 , 3 . ) ;
9 }
10 }
double x = 1 double y = 2
Point Point p1
Point p2 double x = 2.5
double y = 3 Point
2
Dé-référencement implicite (logique de bloc,
destruction de variables ⇒ destruction de références)
1 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
2 {
3 P o i n t p1 = new P o i n t ( 1 , 2 ) ;
4 S y s t e m . o u t . p r i n t l n ( p1 ) ;
5 }
6 S y s t e m . o u t . p r i n t l n ( p1 ) ;
7 // ERREUR DE COMPILATION : p1 n ’ e x i s t e p l u s i c i !
8 }
double x = 1 double y = 2
Point Point p1
Dé-référencement d’un objet
1
Dé-référencement explicite (usage de =)
1 // F i c h i e r T e s t P o i n t . j a v a
2 p u b l i c c l a s s T e s t P o i n t {
3 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
4 // a p p e l du c o n s t r u c t e u r a v e c d e s v a l e u r s c h o i s i e s
5 P o i n t p1 = new P o i n t ( 1 . , 2 . ) ; P o i n t p2 = p1 ;
6 // Dé−r e f e r e n c e m e n t de l ’ i n s t a n c e [ 1 , 2 ]
7 // e t r e f e r e n c e m e n t de l ’ i n s t a n c e [ 2 . 5 , 3 ]
8 p2 = new P o i n t ( 2 . 5 , 3 . ) ;
9 }
10 }
double x = 1 double y = 2
Point Point p1
2
Dé-référencement implicite (logique de bloc,
destruction de variables ⇒ destruction de références)
1 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
2 {
3 P o i n t p1 = new P o i n t ( 1 , 2 ) ;
4 S y s t e m . o u t . p r i n t l n ( p1 ) ; }
6 S y s t e m . o u t . p r i n t l n ( p1 ) ;
7 // ERREUR DE COMPILATION : p1 n ’ e x i s t e p l u s i c i !
8 }
double x = 1 double y = 2
Point Point p1
Dé-référencement d’un objet
1
Dé-référencement explicite (usage de =)
1 // F i c h i e r T e s t P o i n t . j a v a
2 p u b l i c c l a s s T e s t P o i n t {
3 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
4 // a p p e l du c o n s t r u c t e u r a v e c d e s v a l e u r s c h o i s i e s
5 P o i n t p1 = new P o i n t ( 1 . , 2 . ) ; P o i n t p2 = p1 ;
6 // Dé−r e f e r e n c e m e n t de l ’ i n s t a n c e [ 1 , 2 ]
7 // e t r e f e r e n c e m e n t de l ’ i n s t a n c e [ 2 . 5 , 3 ]
8 p2 = new P o i n t ( 2 . 5 , 3 . ) ;
9 }
10 }
2
Dé-référencement implicite (logique de bloc,
destruction de variables ⇒ destruction de références)
1 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
2 {
3 P o i n t p1 = new P o i n t ( 1 , 2 ) ;
4 S y s t e m . o u t . p r i n t l n ( p1 ) ;
5 }
6 S y s t e m . o u t . p r i n t l n ( p1 ) ;
7 // ERREUR DE COMPILATION : p1 n ’ e x i s t e p l u s i c i !
8 }
double x = 1 double y = 2
Point Point p1
Dé-référencement d’un objet
1
Dé-référencement explicite (usage de =)
1 // F i c h i e r T e s t P o i n t . j a v a
2 p u b l i c c l a s s T e s t P o i n t {
3 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
4 // a p p e l du c o n s t r u c t e u r a v e c d e s v a l e u r s c h o i s i e s
5 P o i n t p1 = new P o i n t ( 1 . , 2 . ) ; P o i n t p2 = p1 ;
6 // Dé−r e f e r e n c e m e n t de l ’ i n s t a n c e [ 1 , 2 ]
7 // e t r e f e r e n c e m e n t de l ’ i n s t a n c e [ 2 . 5 , 3 ]
8 p2 = new P o i n t ( 2 . 5 , 3 . ) ;
9 }
10 }
2
Dé-référencement implicite (logique de bloc,
destruction de variables ⇒ destruction de références)
1 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
2 {
3 P o i n t p1 = new P o i n t ( 1 , 2 ) ;
S y s t e m . o u t . p r i n t l n ( p1 ) ; double x = 1
Point Point p1
Retour sur la logique de bloc...
1
le dé-référencement dépend de l’endroit où la variable est déclarée (pas de l’endroit où la variable est initialisée)
2
ne pas confondre la destruction d’une variable et la destruction d’une instance
1 p u b l i c s t a t i c
2 v o i d main ( S t r i n g [ ] a r g s ) {
3 4
5 {
6 P o i n t p1 =
7 new P o i n t ( 1 , 2 ) ;
8 S y s t e m . o u t . p r i n t l n ( p1 ) ;
9 } // d e s t r u c t i o n de
10 // l a v a r i a b l e p1
11
12 S y s t e m . o u t . p r i n t l n ( p1 ) ;
13 // ERREUR DE COMPILATION
14 // p1 n ’ e x i s t e p l u s i c i !
15 }
1 p u b l i c s t a t i c
2 v o i d main ( S t r i n g [ ] a r g s ) {
3 P o i n t p1 ; // d e c l a r a t i o n
4 // a v a n t l e b l o c
5 {
6 // i n i t i a l i s a t i o n de p1
7 p1 = new P o i n t ( 1 , 2 ) ;
8 S y s t e m . o u t . p r i n t l n ( p1 ) ;
9 } // p a s de d e s t r u c t i o n de p1
10 11
12 S y s t e m . o u t . p r i n t l n ( p1 ) ;
13 // OK, p a s de p r o b l e m e
14 15 }
Retour sur la logique de bloc (2)
1
le dé-référencement dépend de l’endroit où la variable est déclarée (pas de l’endroit où la variable est initialisée)
2
ne pas confondre la destruction d’une variable et la destruction d’une instance
1 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
2 P o i n t p1 ; // d e c l a r a t i o n a v a n t l e b l o c
3 {
4 P o i n t p2 = new P o i n t ( 1 , 2 ) ;
5 // i n i t i a l i s a t i o n de p1
6 p1 = p2 ;
7 S y s t e m . o u t . p r i n t l n ( p1 ) ;
8 } // d e s t r u c t i o n de p2
9
10 S y s t e m . o u t . p r i n t l n ( p1 ) ;
11 // OK, p a s de p r o b l e m e
12 }
double x = 1 double y = 2
Point Point p1
Point p2
Destruction des instances
Destruction d’instance ⇔ instance plus référencée
1 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
2 P o i n t p1 = new P o i n t ( 1 , 2 ) ;
3 p1 = n u l l;
4 } double x = 1
double y = 2 Point Point p1
Pas besoin d’expliquer comment détruire un objet (6= C++) Le Garbage Collector planifie la destruction
1 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
2 . . .
3 f o r(i n t i =0; i <10; i ++){
4 // o p t i m i s a t i o n p o s s i b l e : r e u t i l i s a t i o n de l a memoire a l l o u e e
5 P o i n t p1 = new P o i n t ( (i n t) ( Math . random ( )∗1 0 ) , (i n t) ( Math . random ( )∗1 0 ) ) ;
6 . . .
7 }
8 }
Appel explicite au garbage collector (pour libérer la mémoire):
1 S y s t e m . gc ( ) ;
Destruction des instances
Destruction d’instance ⇔ instance plus référencée
1 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
2 P o i n t p1 = new P o i n t ( 1 , 2 ) ;
3 p1 = n u l l;
4 } double x = 1
double y = 2 Point Point p1
Pas besoin d’expliquer comment détruire un objet (6= C++) Le Garbage Collector planifie la destruction
1 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
2 . . .
3 f o r(i n t i =0; i <10; i ++){
4 // o p t i m i s a t i o n p o s s i b l e : r e u t i l i s a t i o n de l a memoire a l l o u e e
5 P o i n t p1 = new P o i n t ( (i n t) ( Math . random ( )∗1 0 ) , (i n t) ( Math . random ( )∗1 0 ) ) ;
6 . . .
7 }
}
Exemple complet (1/2)
... sur un exemple parlant:
1
P o i n t p =
newP o i n t ( 1 , 2 ) ;
2
P o i n t p2 =
newP o i n t ( 3 , 4 ) ;
3
// P o i n t p3 = p ; // d i f f e r e n c e a v e c e t s a n s c e t t e l i g n e
4
p = p2 ;
Cas 1: ligne commentée.
L’instance Point(1,2) est détruite à l’issue du re-référencement de p... ... de toutes façons, cette instance était inaccessible.
1
P o i n t p =
newP o i n t ( 1 , 2 ) ;
2
P o i n t p2 =
newP o i n t ( 3 , 4 ) ;
3
P o i n t p3 = p ; // d i f f e r e n c e a v e c e t s a n s c e t t e l i g n e
4
p = p2 ;
Cas 2: ligne dé-commentée
L’instance Point(1,2) est conservée...
On y accède par la variable p3
Exemple complet (1/2)
... sur un exemple parlant:
1
P o i n t p =
newP o i n t ( 1 , 2 ) ;
2
P o i n t p2 =
newP o i n t ( 3 , 4 ) ;
3
// P o i n t p3 = p ; // d i f f e r e n c e a v e c e t s a n s c e t t e l i g n e
4
p = p2 ;
Cas 1: ligne commentée.
L’instance Point(1,2) est détruite à l’issue du re-référencement de p...
... de toutes façons, cette instance était inaccessible.
1
P o i n t p =
newP o i n t ( 1 , 2 ) ;
2
P o i n t p2 =
newP o i n t ( 3 , 4 ) ;
3
P o i n t p3 = p ; // d i f f e r e n c e a v e c e t s a n s c e t t e l i g n e
4
p = p2 ;
Cas 2: ligne dé-commentée
L’instance Point(1,2) est conservée...
On y accède par la variable p3
Exemple complet (1/2)
... sur un exemple parlant:
1
P o i n t p =
newP o i n t ( 1 , 2 ) ;
2
P o i n t p2 =
newP o i n t ( 3 , 4 ) ;
3
// P o i n t p3 = p ; // d i f f e r e n c e a v e c e t s a n s c e t t e l i g n e
4
p = p2 ;
Cas 1: ligne commentée.
L’instance Point(1,2) est détruite à l’issue du re-référencement de p...
... de toutes façons, cette instance était inaccessible.
1
P o i n t p =
newP o i n t ( 1 , 2 ) ;
2
P o i n t p2 =
newP o i n t ( 3 , 4 ) ;
3
P o i n t p3 = p ; // d i f f e r e n c e a v e c e t s a n s c e t t e l i g n e
4
p = p2 ;
Cas 2: ligne dé-commentée
L’instance Point(1,2) est conservée...
On y accède par la variable p3
Exemple complet (2/2)
1 P o i n t p = new P o i n t ( 1 , 1 ) ;
2 P o i n t p2 = new P o i n t ( 2 , 2 ) ;
3 P o i n t p3 = p ; P o i n t p4 = p3 ;
4 p3 = n u l l; p2 = n u l l;
Combien d’instances ont été créées au total?
Combien d’instances restent-il à la fin de l’exécution du programme?
Dessiner l’état de la mémoire.
5 f o r(i n t i =0; i <10; i ++){
6 p = p2 ;
7 p2 = new P o i n t ( Math . random ( )∗1 0 , Math . random ( )∗1 0 ) ;
8 }
Exemple complet (2/2)
1 P o i n t p = new P o i n t ( 1 , 1 ) ;
2 P o i n t p2 = new P o i n t ( 2 , 2 ) ;
3 P o i n t p3 = p ; P o i n t p4 = p3 ;
4 p3 = n u l l; p2 = n u l l;
5 f o r(i n t i =0; i <10; i ++){
6 p = p2 ;
7 p2 = new P o i n t ( Math . random ( )∗1 0 , Math . random ( )∗1 0 ) ;
8 }