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.
- Zapomenuté časovače (
// 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:
- 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
}
- Nullování odkazů: Výslovně nullujte odkazy na velké nebo nepoužívané objekty, aby je mohl garbage collector shromáždit.
- Použití
WeakMapaWeakSet: Pro ukládání odkazů na objekty, které mohou být odstraněny garbage collectorem, když na ně není žádná jiná silná reference. - Optimalizace datových struktur: Používejte efektivnější struktury nebo přístupy (například lazy loading).
- Omezení velikosti cache: Implementujte strategie vyhození.
- 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.