Gestiunea Memoriei și Prevenirea Memory Leaks în JavaScript în JavaScript

Variabile și tipuri V8 Memory Management

Cum funcționează algoritmul Mark-and-Sweep de Garbage Collection: identificarea și prevenirea scurgerilor de memorie (event listeners necurățați, noduri DOM detașate, închideri lexicale/closures) cu Chrome DevTools.

Sintaxă
Garbage Collection (Mark-and-Sweep) | AbortController | WeakMap & WeakSet

Deși JavaScript este un limbaj cu gestionare automată a memoriei prin Garbage Collection (GC), aplicațiile de tip Single Page Application (React, Vue, SPA) pot suferi frecvent de scurgeri de memorie (Memory Leaks). O scurgere apare atunci când un obiect nu mai este necesar aplicației, dar rămâne referențiat accidental dintr-o rădăcină activă (Root), împiedicând colectorul de gunoi să elibereze memoria RAM.

Cum funcționează algoritmul Mark-and-Sweep

Colectorul de gunoi pornește periodic de la rădăcini (variabile globale de pe window, stiva curentă de execuție) și marchează (mark) toate obiectele accesibile prin referințe directe sau indirecte. În faza a doua (sweep), orice zonă de memorie care nu a fost marcată este considerată inaccesibilă și este eliberată.

Cele 3 Cauze Majore de Memory Leaks și Soluțiile Lor
// 1. EVENT LISTENERS NECURĂȚAȚI LA DEMONTAREA UNEI COMPONENTE
// Problema: Callback-ul păstrează o referință vie către întregul obiect părinte!
// Soluție modernă: Folosește AbortController pentru curățare automată printr-un singur apel:
const controller = new AbortController();

window.addEventListener('resize', () => {
    console.log("Fereastră redimensionată");
}, { signal: controller.signal });

// Când componenta se distruge, oprim toți listenerii asociați instant:
controller.abort();

// 2. NODURI DOM DETAȘATE (Detached DOM Nodes)
// Problema: Ștergi un element din HTML, dar îl păstrezi salvat într-o variabilă JS:
let butonSalvat = document.getElementById('btn-salvare');
document.body.removeChild(butonSalvat);
// Deși a dispărut din pagină, întreg nodul și copiii lui rămân în RAM!
// Soluție: Eliberează referința când nu mai este necesară:
butonSalvat = null;

// 3. CACHE-URI SAU METADATE CU OBIECTE PE POST DE CHEI
// Problema: Obiectul cheie dintr-un Map normal nu poate fi șters de GC niciodată.
// Soluție: Folosește WeakMap sau WeakSet (referințe slabe care nu blochează GC):
const datePrivateCache = new WeakMap();
let utilizator = { id: 101 };
datePrivateCache.set(utilizator, { token: "abc" });

utilizator = null; // Când utilizatorul devine null, intrarea din WeakMap este ștearsă automat de GC!

Depanarea Memoriei în Chrome DevTools

Deschide panoul Memory din Chrome DevTools, selectează Heap Snapshot, realizează o primă captură, efectuează acțiunea suspectată în pagină (ex: deschide și închide o fereastră modală de 10 ori), apoi realizează o a doua captură. Comparația Comparison va evidenția imediat obiectele care s-au acumulat și nu au fost curățate.