Le ramasse-miettes (garbage collector)¶
🤖 Rédaction assistée par IA.
Définition¶
Le ramasse-miettes (garbage collector) libère automatiquement la mémoire occupée par les objets qui ne sont plus atteignables depuis les variables du programme (variables locales, globales...).
Il décharge le développeur de la libération manuelle de la mémoire (ex : free en C, delete en C++).
En pratique¶
Le comptage de références¶
Chaque objet mémorise le nombre de références qui pointent vers lui et il est libéré dès que ce nombre tombe à zéro (ex : CPython, PHP, Swift).
Ce mécanisme ne libère pas les références circulaires. CPython et PHP le complètent par un collecteur de cycles qui se déclenche automatiquement (gc.collect() en Python et gc_collect_cycles() en PHP permettent de le forcer) :
import gc
a = {}
b = {"other": a}
a["other"] = b # cycle a -> b -> a
del a, b # les compteurs ne tombent pas à zéro : rien n'est libéré
gc.collect() # le collecteur de cycles libère a et b
Le traçage¶
Le ramasse-miettes parcourt périodiquement les objets atteignables à partir des variables du programme et libère les autres (algorithme mark and sweep). Les cycles sont alors traités naturellement (ex : Java, JavaScript, C#, Go).
Les alternatives au ramasse-miettes¶
- La libération manuelle (
malloc/freeen C,new/deleteen C++), source de fuites mémoire et de libérations multiples. - Les pointeurs intelligents en C++ moderne :
- std::unique_ptr : propriétaire unique, libération à la sortie de la portée (RAII)
- std::shared_ptr : comptage de références en cas de propriétaires multiples, avec std::weak_ptr pour casser les cycles
- La propriété (ownership) en Rust : chaque valeur a un propriétaire unique et est libérée quand celui-ci sort de la portée, ce que le compilateur vérifie (
Rc/Weakpour les propriétaires multiples).
Mises en garde¶
- Le ramasse-miettes peut interrompre l'exécution (pauses) : les implémentations modernes (générationnelles, concurrentes) limitent ce problème sans le supprimer (c.f. jmdoudoux.developpez.com - Java - La gestion de la mémoire).
- Le moment de la libération n'est pas garanti : il ne faut pas compter sur lui pour fermer un fichier ou une connexion (voir la libération des ressources dans La gestion des erreurs).