Sobes.tech
Middle

Cum ai remedia o scurgere de memorie în codul tău?

sobes.tech AI

Răspuns de la AI

Ai identifica sursa scurgerii folosind instrumentele de dezvoltare ale browserului (Timeline / Performance, Memory)?

Cauze comune ale scurgerilor de memorie:

  • Referințe pendinte către obiecte:
    • Timer uitat (setInterval, setTimeout) care fac referire la obiecte.
    • Handler de evenimente confuz, care nu au fost deconectate (removeEventListener).
    • Închideri care mențin variabile externe mai mult decât este necesar.
    • Elemente DOM eliminate din document, dar cu referințe în JavaScript.
// Exemplu de scurgere din cauza unui timer uitat
const leakyObject = {
  data: 'some data'
};

setInterval(() => {
  console.log(leakyObject.data); // leakyObject nu poate fi colectat de garbage collector
}, 1000);
  • Structuri de date mari:
    • Crearea și stocarea de array-uri sau obiecte excesiv de mari când se pot folosi iteratoare sau streaming.
  • Utilizare incorectă a cache-urilor:
    • Cache-uri care cresc infinit fără strategie de evacuare (LRU, LFU etc.).
  • Scurgeri din biblioteci externe:
    • Verificați documentația sau codul sursă al bibliotecilor pentru probleme potențiale.

Remedieri:

  1. Anulați evenimentele și timer-ele: Asigurați-vă că toate handler-ele de evenimente sunt deconectate și timer-ele sunt curățate la distrugerea componentului sau obiectului.
// Curățare corectă a timer-ului
const leakyObject = {
  data: 'some data'
};
let timerId;

function startTimer() {
  timerId = setInterval(() => {
    console.log(leakyObject.data);
  }, 1000);
}

function stopTimer() {
  clearInterval(timerId); // Curățare timer
}
  1. Nullificați referințele: Nullificați explicit referințele către obiecte mari sau neutilizate pentru ca colectorul de gunoi să le poată colecta.
  2. Utilizați WeakMap și WeakSet: Pentru a stoca referințe către obiecte care pot fi eliminate de colectorul de gunoi când nu mai au alte referințe puternice.
  3. Optimizarea structurilor de date: Folosiți structuri de date sau abordări mai eficiente (de exemplu, încărcare leneșă).
  4. Limitarea dimensiunii cache-urilor: Implementați strategii de evacuare.
  5. Actualizați sau înlocuiți bibliotecile: Dacă problema este într-o bibliotecă externă, actualizați-o sau găsiți o alternativă.

După remediere, folosiți din nou instrumentele de dezvoltare pentru a confirma absența scurgerilor.