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.
- Timer uitat (
// 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:
- 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
}
- Nullificați referințele: Nullificați explicit referințele către obiecte mari sau neutilizate pentru ca colectorul de gunoi să le poată colecta.
- Utilizați
WeakMapșiWeakSet: 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. - Optimizarea structurilor de date: Folosiți structuri de date sau abordări mai eficiente (de exemplu, încărcare leneșă).
- Limitarea dimensiunii cache-urilor: Implementați strategii de evacuare.
- 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.