Grabage Collector ou Ramasse-Miettes

goudji allan
4 min readJan 24, 2019

--

Le ramasse miette, est un sous-système informatique de gestion de la mémoire. Notamment en Java elle libère les objets qui ne sont plus utilisés afin de recycler de la mémoire. Un objet est dit libre s’il n’existe plus aucune référence dans la JVM (Java Virtual Machine) pointant vers lui. Pour libérer un programme le GC exécute un finalizer sur l’objet qui permet de l’arrêter proprement mais si cela soulève une exception l’objet sera tout de même arrêté pour le GC.

La mise en œuvre d’un GC possède plusieurs avantages :

· Amélioration de la productivité du développeur car la libération de mémoire se fait implicitement

· Garde l’intégrité de la machine virtuelle car une instruction ne peut pas utiliser un objet qui n’existe plus en mémoire.

Elle possède aussi des défauts :

· Consommation de la CPU et de la mémoire

· Les fuites de mémoires car le GC ne l’interdit pas si le développeur ne fait pas attention à la gestion de la mémoire.

a. Le rôle d’un GC

Le GC s’exécute dans un ou plusieurs Thread de la JVM, les objets utilisés ou possédant une référence ne seront pas toucher par le GC. En revanche les objets inutilisés seront considérés comme pouvant être libérer, le traitement pour déterminer qui si un objet possède ou pas de référence est appelé grabage collection.

Le rôle principal d’un GC est de parcourir la mémoire et de marque les objets qui ont des références, et à la fin du parcours les objets qui n’ont pas été marqué verront leur mémoire récupérée ce qui augmentera l’espace mémoire de la JVM.

Dans l’exemple ci-dessus, un objet A est créé. Au cours de sa vie, un objet B est instancié et l’objet A possède une référence sur l’objet B. Tant que cette référence existe, l’objet B ne sera pas supprimé par le ramasse-miettes même si l’objet B n’est plus considéré comme utile d’un point de vue fonctionnel.

Un GC a plusieurs rôles :

· Récupérer la mémoire des objet inutilisés

· Compacter la mémoire libérer pour les objets inutilisés

· Intervenir dans l’allocation de la mémoire des nouveaux objets.

· Non suppression des objets ayant encore une référence

L’algorithme décrit plus haut est le plus basique pour un GC, le gros inconvénient de cet algo est que son temps d’exécution est proportionnel au nombre d’objet en mémoire, en outre pendant son exécution l’application est en arrêt.

b. Concepts des algorithmes d’un GC

Plusieurs aspects doivent être pris en compte dans le choix de l’algorithmes à utiliser lors d’une collection par le GC soit un (Serial ou Parallel) ; (Stop the world ou concurrent) ; (compacting, no-compacting ou copying)

· Serial ou parallel : Avec une collection de type serial, on exécute une tache en dépit du nombre de processeurs disponibles. Tan disque le type parallel les taches sont exécutées sur l’ensemble des processeurs. Le temps de traitement est plus court mais la complexité augmente.

· Stop the world ou concurrent : Avec une collection de type stop the world, l’application est en arrêt pendant le traitement d’une collection. L’algorithme de traitement st très soft mais le vrai problème de ce type de collection est la mise en pause de l’application. Avec une collection de type concurrent, on peut réaliser simultanément plusieurs collections en revanche il ne peut pas réaliser tous ces traitements en mode concurrent il sera obligé de passer de pour certains en mode Stop the world. L’algorithme d’une collection de type concurrent est très complexe de ce fait il a besoin de plus de ressource de la CPU.

· Compacting, No-Compacting ou Copying: Cette étape se fait après la libération des objets non utilisé, cela reviens à compacter la mémoire de tel sorte qu’on ait d’un côté les objets alloués et l’autre l’espace mémoire à allouer. Ce compactage nécessite un certain temps de traitement, mais une fois fait l’allocation de la mémoire aux nouveaux objets devient plus aisé. Si la mémoire n’est pas compactée le temps de traitement sera plus faible mais l’allocation de la mémoire sera un peu plus compliquée car il va falloir parcourir à chaque fois la mémoire à la recherche d’espace libre nécessaire.

Il existe un autre type de gestion de la mémoire qui consiste à copier les objets survivants à différentes collections dans des zones de mémoires différentes (copying). Ainsi la zone de création des objets se vide au fur et à mesure, ce qui rend l’allocation rapide. Le copying nécessite plus de mémoire.

c. Les limites d’un GC

Le ramasse-miette ou GC est un processus complexe qui est couteux en CPU et nécessite un temps d’exécution considérable pouvant être à l’origine de problème de performance.

Il ne résout pas tous les problèmes de mémoires :

- Il n’empêche pas un manque de mémoire si trop d’objets sont à allouer dans un espace mémoire restreint.

- Il n’empêche pas les fuite de mémoire potentielles

Une bonne maitrise du mode de fonctionnement du GC est requise pour apporter une solution lorsque celui-ci est à l’origine d’un point du système limitant les performances globales d’une application (goulot d’étranglement).

Le grabage collector est un mécanise complexe mais fiable en règle générale. Cependant son fonctionnement doit essayer de limiter l’impact sur les performances de l’application en essayant de limiter son temps de traitement et la fréquence à laquelle elle s’exécute. La performance du garbage collector est intimement liée à la taille de la mémoire qu’il a à gérer. Ainsi, si la taille de la mémoire est petite, le temps de traitement du garbage collector sera court mais sa fréquence d’exécution sera plus grande. Si la taille de la mémoire est grande, la fréquence d’exécution sera moindre mais le temps de traitement sera long. Le réglage de la taille de la mémoire influe sur les performances du garbage collector et est un des facteurs importants en fonction des besoins de chaque application. Pour atteindre ces objectifs, des travaux sont constamment en cours de développement afin de trouver de nouveaux algorithmes.

--

--