Un garbage collector (GC) est un gestionnaire de mémoire. De nombreux langages de programmation ont un GC intégré. Cette fonctionnalité alloue et libère automatiquement la mémoire dans un programme. Il libère de la mémoire bloquée et inutilisée qui ralentit votre application.

La beauté d'un GC est qu'il libère de la mémoire en votre nom, sans que vous ayez besoin de faire quoi que ce soit. Vous pourriez donc considérer qu'il s'agit d'une fonctionnalité si essentielle que vous vous attendez à ce que tous les langages de programmation l'aient. Malheureusement, ce n'est pas le cas; même un langage populaire comme C peut manquer de GC.

Comment fonctionne l'allocation de mémoire ?

Lorsque vous exécutez un programme dans n'importe quel langage de programmation, votre système d'exploitation réserve un pile de données en mémoire pour ce programme. Ce programme possède et occupe cette pile de données jusqu'à la fin de son exécution. Si votre programme a besoin de plus de mémoire que ce qui est disponible, il peut allouer dynamiquement plus de mémoire à partir du tas de mémoire du système d'exploitation.

instagram viewer

En programmation, une variable représente un emplacement mémoire. Ainsi, lorsque vous déclarez une nouvelle variable, le langage de programmation alloue de l'espace en mémoire pour cette variable. La variable aura maintenant une adresse mémoire. Jusqu'à ce que vous attribuiez une valeur à cette variable, elle restera non initialisée et peut contenir une valeur parasite.

Si un langage de programmation vous permet de déclarer une variable sans l'initialiser, alors c'est une variable dynamique. Cela signifie que la valeur que vous attribuez à la variable peut changer au fil du temps. Cependant, l'emplacement mémoire de la variable restera le même jusqu'à ce que vous la libériez.

Comment fonctionne la désallocation de mémoire ?

L'allocation de mémoire est un processus similaire pour tous les langages de programmation. Mais la méthode correspondante de désallocation de mémoire a tendance à différer. Il existe deux types de méthodes de désallocation de mémoire; manuel et automatique. Un GC effectue une désallocation automatique.

Désallocation de mémoire sans Garbage Collector

La Langage de programmation C n'utilise pas de GC pour la désallocation de mémoire. Par conséquent, les programmeurs C doivent manuellement allouer et libérer de la mémoire. C permet l'allocation dynamique de mémoire lorsque vous ne savez pas, au moment de la compilation, la quantité de mémoire que vous utiliserez au moment de l'exécution.

La bibliothèque standard (stdlib.h) contient les fonctions que C utilise pour gérer l'allocation dynamique de mémoire. Ces fonctions incluent :

  • malloc(): alloue une taille de mémoire spécifique et renvoie un pointeur vers cette mémoire. S'il n'y a pas suffisamment de mémoire disponible dans le pool de mémoire du système d'exploitation, il renvoie null.
  • free(): libère un bloc de mémoire spécifique et le renvoie au pool de mémoire du système d'exploitation.

Exemple de programme C

#comprendre
#comprendre

entierprincipale()
{
entier *ptr; // déclare le pointeur
entier j; // déclare le compteur

// alloue de l'espace pour 200 entiers
ptr = (entier *) malloc(200 * taille de(entier));

// insère des valeurs entières dans la mémoire allouée
// et affiche chaque valeur sur la console
pour (j = 0; j < 200; j++)
{
ptr[j] = j ;
printf("%d\t",ptr[j]);
}

// désallouer la mémoire précédemment allouée
libre(ptr);
revenir0;
}

Le code ci-dessus alloue de la mémoire pour stocker 200 valeurs entières en utilisant le malloc() fonction. Il utilise un pointeur pour accéder à cet emplacement mémoire et y stocke 200 valeurs entières. Le pointeur imprime également les données stockées à l'emplacement de la mémoire sur la console. Enfin, le programme libère la mémoire précédemment allouée à l'aide de la libre() fonction.

Désallocation de mémoire avec un Garbage Collector

Plusieurs langages de programmation populaires utilisent un GC pour la gestion de la mémoire. Cela rend la vie des programmeurs qui utilisent ces langages beaucoup plus facile. C# et Java sont deux langages de programmation qui utilisent un GC.

Le C#GC

Dans le Langage de programmation C#, un GC gère l'allocation et la désallocation des adresses mémoire. Par conséquent, un programmeur C # n'a pas à se soucier de désallouer un objet une fois qu'il a atteint son objectif.

Le C# GC initialise un pool de mémoire, appelé tas géré, pour chaque nouveau processus (ou programme). Il appelle le VirtualAlloc() fonction pour allouer de la mémoire et la VirtuelLibre() fonction pour le désallouer. La meilleure partie est que tout cela se passe en arrière-plan sans aucun effort de votre part, le programmeur.

Le C# GC dispose d'un moteur d'optimisation, qu'il utilise pour décider quand désallouer de la mémoire. Le moteur d'optimisation examine la racine de l'application pour déterminer quels objets ne sont plus utilisés. Pour ce faire, il crée un graphe qui s'étend de la racine de l'application aux objets connectés. Cette racine comprend des champs statiques, des variables locales, etc. Tout objet non connecté à la racine de l'application est inutile.

Le moteur d'optimisation GC ne se contente pas de collecter de la mémoire par lui-même. Il doit d'abord y avoir une nouvelle demande d'allocation de mémoire. Si le système dispose d'une faible quantité de mémoire disponible, le moteur d'optimisation du GC entrera en jeu.

Le GC Java

En Java, un GC gère également l'allocation et la désallocation des adresses mémoire. Cependant, Java a actuellement quatre types différents de ramasse-miettes pris en charge :

  • Garbage-First (G1)
  • En série
  • Parallèle
  • Collecteur de déchets Z (ZGC)

Le garbage collector G1 est le GC par défaut de Java depuis la sortie du Java Development Kit (JDK) 9. Java organise les données en objets et stocke ces objets dans un tas de taille fixe. Le ramasse-miettes G1 divise le tas en régions de tas de taille égale. Il a ensuite divisé ces régions de tas en deux sections; jeunes et vieilles générations.

Chaque fois que vous créez un nouvel objet, l'attribution de l'espace pour cet objet se produit dans la jeune génération. À l'aide d'un processus de vieillissement, le ramasse-miettes G1 copie les objets des jeunes régions vers les anciennes régions. Il copie également les objets qui se trouvent déjà dans l'ancienne région vers une région plus ancienne.

Le ramasse-miettes G1 effectue alors la majeure partie de sa désallocation de mémoire dans la jeune génération, s'aventurant occasionnellement dans la section de l'ancienne génération.

Quels sont les avantages d'avoir un éboueur ?

L'avantage d'avoir un ramasse-miettes est qu'il vous évite de penser à la gestion de la mémoire lors de l'écriture de votre code. Cela vous donne le temps de vous concentrer sur les autres aspects importants de votre candidature. Cependant, plusieurs autres avantages méritent d'être soulignés.

La récupération des objets inutilisés et la libération de la mémoire permettent une exécution plus propre des applications. Si votre programme libère de la mémoire dès que possible, il aura une empreinte mémoire plus petite et pourra s'exécuter plus efficacement.

Le nettoyage de la mémoire réduit les erreurs liées à la gestion de la mémoire telles que les fuites et les erreurs de pointeur. En effet, le processus ne dépend plus du programmeur et de sa capacité à écrire un code précis.