Middle
Ako by ste opravili únik pamäte vo svojom kóde?
sobes.tech AI
Odpoveď od AI
Určil by som zdroj úniku pomocou nástrojov pre vývojárov prehliadača (Timeline / Performance, Memory).
Bežné príčiny únikov pamäte:
- Visiace odkazy na objekty:
- Zabudnuté časovače (
setInterval,setTimeout), ktoré odkazujú na objekty. - Nejasné spracovateľské funkcie udalostí, ktoré neboli odpojené (
removeEventListener). - Uzávery, ktoré udržiavajú vonkajšie premenné dlhšie, ako je potrebné.
- DOM prvky odstránené z dokumentu, ale odkazy na ne zostali v JavaScripte.
- Zabudnuté časovače (
// Príklad úniku spôsobeného zabudnutým časovačom
const leakyObject = {
data: 'nejaké dáta'
};
setInterval(() => {
console.log(leakyObject.data); // leakyObject nemôže byť zbavený garbage collectorem
}, 1000);
- Veľké dátové štruktúry:
- Vytváranie a ukladanie príliš veľkých polí alebo objektov, keď je možné použiť iterátory alebo streaming.
- Nesprávne používanie cache:
- Cache, ktoré rastú nekonečne bez stratégie vyprázdnenia (LRU, LFU a pod.).
- Úniky z tretích knižníc:
- Skontroloval by som dokumentáciu alebo zdrojový kód knižníc na potenciálne problémy.
Oprava:
- Zrušenie udalostí a časovačov: Uistiť sa, že všetky spracovateľské funkcie udalostí sú odpojené a časovače vyčistené pri zničení komponentu alebo objektu.
// Správne vyčistenie časovača
const leakyObject = {
data: 'nejaké dáta'
};
let timerId;
function startTimer() {
timerId = setInterval(() => {
console.log(leakyObject.data);
}, 1000);
}
function stopTimer() {
clearInterval(timerId); // Vyčistenie časovača
}
- Nulovanie odkazov: Jasne nulovať odkazy na veľké alebo nepoužívané objekty, aby ich mohol zbaviť garbage collector.
- Použitie
WeakMapaWeakSet: Na ukladanie odkazov na objekty, ktoré môžu byť odstránené garbage collectorom, keď na ne nie sú žiadne iné silné odkazy. - Optimalizácia dátových štruktúr: Používať efektívnejšie dátové štruktúry alebo prístupy (napríklad lazy loading).
- Obmedzenie veľkosti cache: Zaviesť stratégie vyprázdnenia cache.
- Aktualizácia alebo výmena knižníc: Ak je problém v tretej strane knižnice, aktualizovať ju alebo nájsť alternatívu.
Po oprave by som opäť použil nástroje pre vývojárov na potvrdenie, že únik neexistuje.