Skip to content

AMPHI 2 JAVA : GARBAGE COLLECTOR

C'est qui qui gère la mémoire ? - en C : C'est moii (en gros l'utilisateur) - en JAVA : C'est la machine virtuel de JAVA (S/O tony)

En JAVA :

Ce qui gère la mémoire en JAVA c'est ce qu'on l'on appelle un ramasse-miette (ou garbage collector en anglais).

I. Pourquoi ramasse-miette ?

Porgrammes-> besoin de mémoire pendant leurs execution Exemples: Allouer des variables, étendre/réduire leurs taille.

Probléme: mémoire limité -> Deux options - Manuellement : Source de problèmes (c'est compliqué) - Automatiquement : dépend de bliothèques/programmes (donc on peut pas tout controlé, c'est aussi moins performant)

Ici on va se pencher la méthode "automatique", c'est à dire qu'on va parle de comment fonctionne le ramasse-miette (ou garbage collector).

ramasse-miette : collecte des "détritus" = les céllules mémoire plus utlisé par les programmes. - Dificille de prévoir quand une cellule mémoire "devient" détruite -> Probléme indécidable (Théorème de Rice).

Comme c'est déficille on as décidier d'utiliser des héreuristiques

Manière ou on laisse l'utilisateur décidier : 1) Laisser l'utilisateur se débrouiller (gestion explicite)

Manière ou la mémoire est gérer automatiquement : 1) Compter les références vers les variables 2) Gérer en fonction de la pile 3) D'autres approches : marquage/balayage ; collection par copie ; ramasse-miette générationels

II. Gestion explicite

Les allocations - Statique - Par la pile - Par les tas (dynamique)

1) Gestion à la C/C++

En gros c'est cool si l'utilisateur est intéligent sinon c'est de la merde.

III. Gestion automatique

= ramasse-miette

Il doit : - être capable de garder/retrouver les données encore actives - libérer les aures

Comment décider quand un objet peut etre libérer ?

  • On ne peut pas le savoir précisément
  • Définir un moyen de le savoir

1er algorithme : comptage de références**

Principe : - pour chaque objet, on lui donne un compteur (entier) indépendant qui correspond au nombre de références à cet objet.

Avantages : - Simple à mettre en place

Inconvénients : - Lorsqu'on fait de l'allocation dynamique, lorsqu'on désalloue avec le comptage de références cela créer des troue en mémoire.

En fait l'algo est plutot naif, mais efficace sont plus grand soucis est vraiment de crée des trous dans la mémoire.

2eme algo : marquage / balayage

Principe : - Déclencher le ramasse-miette par intermittence -> Il doit alors stopper tout les programme lorsqu'il nettoie la mémoire. - A chaque collections : - Phase de marquage = "trouvé les vivants" (les variables encore référencé) - Phase de balayage = "recycler les morts" (libérer les case mémoire qui ont des variables non référencé)

Implantation : - à chaque objet alloué, alloue un marqueur

Algorithme de marquage

Pour toutes les racines du graphe d'objet
- Pour chaque objet rencontré
  - SI l'objet est déjà marqué
    - passer à l'objet suivant
  - SINON
    - marquer l'objet
    - propager l'algorithme sur ses objets référencé

Algorithme de balayage

- Parcourir la liste de mes objets en mémoire
- SI un objet est marqué
  - Le démarquer
  - Le conserver
- SINON
  - j'intègre sa zone mémoire à celle de la zone mémoire vide

L'algo est vraiment cool en vrai il ya juste un petit problème : - Lorsqu'il ya beaucoup de mémoire

3éme algorithme : copie-compactage

  • Faire un marquage
  • recopier les vivants dans un autre espace mémoire 1) de façon continue.

  • Ce nouvel eapce devant le tas

  • L'ancien sera le futur tas du ramasse-miette

En fait le but c'est de remplir les troues qu'il peut avoir dans le tas. - Pour cela on utilise un algo qui permet