Sobes.tech
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.
// 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:

  1. 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
}
  1. Nulovanie odkazov: Jasne nulovať odkazy na veľké alebo nepoužívané objekty, aby ich mohol zbaviť garbage collector.
  2. Použitie WeakMap a WeakSet: Na ukladanie odkazov na objekty, ktoré môžu byť odstránené garbage collectorom, keď na ne nie sú žiadne iné silné odkazy.
  3. Optimalizácia dátových štruktúr: Používať efektívnejšie dátové štruktúry alebo prístupy (napríklad lazy loading).
  4. Obmedzenie veľkosti cache: Zaviesť stratégie vyprázdnenia cache.
  5. 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.