• Aucun résultat trouvé

LU2IN002 CYCLE DE VIE DES OBJETS GABAGE COLLECTOR

N/A
N/A
Protected

Academic year: 2022

Partager "LU2IN002 CYCLE DE VIE DES OBJETS GABAGE COLLECTOR"

Copied!
21
0
0

Texte intégral

(1)

LU2IN002

CYCLE DE VIE DES OBJETS GABAGE COLLECTOR

Vincent Guigue & Christophe Marsala

(2)

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

(3)

(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.

(4)

(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

(5)

(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 }

(6)

(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é?

(7)

(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é?

(8)

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

(9)

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

(10)

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

(11)

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

(12)

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

(13)

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 }

(14)

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

(15)

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 ( ) ;

(16)

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 }

}

(17)

Exemple complet (1/2)

... sur un exemple parlant:

1

P o i n t p =

new

P o i n t ( 1 , 2 ) ;

2

P o i n t p2 =

new

P 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 =

new

P o i n t ( 1 , 2 ) ;

2

P o i n t p2 =

new

P 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

(18)

Exemple complet (1/2)

... sur un exemple parlant:

1

P o i n t p =

new

P o i n t ( 1 , 2 ) ;

2

P o i n t p2 =

new

P 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 =

new

P o i n t ( 1 , 2 ) ;

2

P o i n t p2 =

new

P 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

(19)

Exemple complet (1/2)

... sur un exemple parlant:

1

P o i n t p =

new

P o i n t ( 1 , 2 ) ;

2

P o i n t p2 =

new

P 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 =

new

P o i n t ( 1 , 2 ) ;

2

P o i n t p2 =

new

P 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

(20)

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 }

(21)

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 }

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.

Références

Documents relatifs

Découpe et colle les images dans l’ordre chronologique.. Le cycle de vie

Je mettrai en fond, une troisième feuille à travers laquelle passera également l’attache, afin de pouvoir coller ceci dans le cahier.. Cycle de vie

Souvent dose dépendant Apparaît à distance de la prise. E End of use Par

Cette approche globale de la vie d’un médicament est nécessaire pour que tous les acteurs trouvent leur place et puissent collaborer dans l’intérêt de la santé publique..

Renaud Marlet LaBRI /

Chap.2 p.10 Copyrights Julie Vachon,

Notre entreprise est née en septembre 2019. C’est dans le cadre de notre chef d’œuvre que nous avons décidé de mettre en place un projet collectif et de proposer un

Les chances de survie des larves dépendent fortement de la présence d’un nombre suffisant de pucerons à proximité de leur lieu de naissance. Les larves muent à