Sobes.tech
Middle

Jak bys opravil únik paměti ve svém kódu?

sobes.tech AI

Odpověď od AI

Určil byste zdroj úniku pomocí nástrojů pro vývojáře prohlížeče (Timeline / Performance, Memory)?

Časté příčiny úniků paměti:

  • Visící odkazy na objekty:
    • Zapomenuté časovače (setInterval, setTimeout), které odkazují na objekty.
    • Nejasní obsluha událostí, které nebyly odpojeny (removeEventListener).
    • Uzávěry, které udržují externí proměnné déle, než je nutné.
    • Elementy DOM odstraněné z dokumentu, ale na které jsou stále odkazy v JavaScriptu.
// Příklad úniku kvůli zapomenutému časovači
const leakyObject = {
  data: 'nějaká data'
};

setInterval(() => {
  console.log(leakyObject.data); // leakyObject nemůže být shromážděn garbage collectorem
}, 1000);
  • Velké datové struktury:
    • Vytváření a ukládání příliš velkých polí nebo objektů, když lze použít iterátory nebo streaming.
  • Nesprávné používání cache:
    • Cache, které rostou nekonečně bez strategie vyhození (LRU, LFU atd.).
  • Úniky z externích knihoven:
    • Zkontrolujte dokumentaci nebo zdrojový kód knihoven na potenciální problémy.

Oprava:

  1. Zrušení událostí a časovačů: Ujistěte se, že všechny obsluhy událostí jsou odpojeny a časovače jsou vyčištěny při ničení komponenty nebo objektu.
// Správné vyčištění časovače
const leakyObject = {
  data: 'nějaká data'
};
let timerId;

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

function stopTimer() {
  clearInterval(timerId); // Vyčištění časovače
}
  1. Nullování odkazů: Výslovně nullujte odkazy na velké nebo nepoužívané objekty, aby je mohl garbage collector shromáždit.
  2. Použití WeakMap a WeakSet: Pro ukládání odkazů na objekty, které mohou být odstraněny garbage collectorem, když na ně není žádná jiná silná reference.
  3. Optimalizace datových struktur: Používejte efektivnější struktury nebo přístupy (například lazy loading).
  4. Omezení velikosti cache: Implementujte strategie vyhození.
  5. Aktualizace nebo nahrazení knihoven: Pokud je problém v externí knihovně, aktualizujte ji nebo najděte alternativu.

Po opravě znovu použijte nástroje pro vývojáře k potvrzení, že úniky nejsou přítomny.