Sobes.tech
Junior

Ce sunt scurgerile de memorie și de ce reprezintă o problemă?

sobes.tech AI

Răspuns de la AI

Scurgeri de memorie reprezintă o situație în care o parte din memoria alocată, care nu mai este necesară pentru aplicație, nu este eliberată de sistemul de gestionare a memoriei și rămâne inaccesibilă pentru utilizare ulterioară.

Probleme legate de scurgerile de memorie:

  • Reducerea performanței: Memoria neeliberată se acumulează treptat, reducând volumul de memorie RAM disponibil pentru alte procese sau pentru aplicație în sine. Acest lucru poate duce la încetiniri, "înghețări" și "frizoane".
  • Erori ale aplicației: Dacă scurgerea este semnificativă, aplicația poate epuiza memoria disponibilă, ceea ce duce la erori de tipul "out of memory" și închiderea neașteptată.
  • Creșterea consumului de resurse: O aplicație cu scurgeri de memorie necesită mai multe resurse de sistem, ceea ce poate afecta negativ funcționarea altor aplicații și a întregului sistem, mai ales pe dispozitive cu resurse limitate (de exemplu, dispozitive mobile).

În JavaScript, majoritatea scurgerilor de memorie apar din cauza unei gestionări neglijente a referințelor (closure, temporizatoare, ascultători de evenimente), care continuă să mențină în memorie obiecte care teoretic ar trebui colectate de colectorul de gunoi.

Exemplu de o scurgere simplă în JavaScript:

// Array în care pot acumula obiecte,
// dacă referințele către acestea nu sunt eliminate la timp
let leakyArray = [];

function createLeak() {
  let obj = {
    data: Math.random() // Date aleatorii
  };

  // referință globală neintenționată
  // Dacă uitați să declarați variabila cu let/const/var
  // sau să atribuiți o proprietate obiectului global window (în browser)
  // această referință poate fi cauza scurgerii, menținând obj în memorie
  // window.globalObj = obj; 

  // Dacă referința este adăugată într-un array care nu este niciodată curățat
  leakyArray.push(obj); 
}

// Apelarea repetată a funcției duce la creșterea leakyArray
for (let i = 0; i < 1000; i++) {
  createLeak();
}

// Chiar dacă createLeak() se termină, obiectele
// din interiorul leakyArray continuă să ocupe spațiu în memorie,
// dacă leakyArray nu este colectat sau curățat

Pentru a preveni scurgerile de memorie, este important să urmați aceste reguli:

  • Ștergeți ascultătorii de evenimente (removeEventListener).
  • Anulați temporizatoarele (clearInterval, clearTimeout).
  • Eliberați resursele externe.
  • Folosiți cu prudență closures, mai ales în componentele cu durată lungă.
  • Verificați și curățați referințele către elementele DOM dacă acestea sunt eliminate din arbore.