Dans des langages de programmation sans ramasse-miettes, une référence circulaire peut entraîner une fuite de mémoire. Cela signifie que la mémoire allouée pour les objets ne sera pas libérée, car le système ne peut pas déterminer si ces objets sont encore nécessaires ou non.
Heureusement, le ramasse-miettes de JavaScript est assez intelligent pour gérer les références circulaires. Il utilise un algorithme appelé « collecte de cycle » qui détecte les objets qui sont inaccessibles et les supprime, même s’ils se référencent mutuellement. Ainsi, dans le contexte de JavaScript, une référence circulaire comme celle entre obj1
et obj2
ne causera pas de fuite de mémoire.
const obj1 = {};
const obj2 = {};
obj1.reference = obj2; // obj1 fait référence à obj2
obj2.reference = obj1; // obj2 fait référence à obj1
L’algorithme de garbage collection en JavaScript fonctionne en identifiant les objets qui ne sont plus accessibles depuis la racine de l’objet, puis en récupérant la mémoire qu’ils occupent. Voici comment il fonctionne en termes simples:
Marquage: L’algorithme commence par un ensemble d’objets appelés « racines ». Les racines sont généralement les objets dans la pile d’appel (variables locales, etc.). Il marque tous les objets qui sont accessibles depuis les racines.Parcours: Ensuite, il parcourt tous les objets marqués et marque leurs références. Ce processus est récursif et continue jusqu’à ce que tous les objets accessibles soient marqués.Suppression: Après le marquage, l’algorithme parcourt la mémoire heap et récupère les objets qui n’ont pas été marqués. Ces objets sont considérés comme non accessibles et donc, leur mémoire est libérée.