Sobes.tech
Middle

Kako biste popravili curenje memorije u svom kodu?

sobes.tech АИ

Одговор од АИ

Da li biste identifikovali izvor curenja memorije pomoću alata za razvojne programere pretraživača (Timeline / Performance, Memory)?

Česti uzroci curenja memorije:

  • Viseće reference na objekte:
    • Zaboravljeni tajmeri (setInterval, setTimeout) koji referišu na objekte.
    • Nejasni rukovaoci događaja koji nisu odvojeni (removeEventListener).
    • Zatvaranja koja drže spoljne promenljive duže nego što je potrebno.
    • DOM elementi uklonjeni iz dokumenta, ali na koje postoje reference u JavaScript-u.
// Primer curenja zbog zaboravljenog tajmera
const leakyObject = {
  data: 'neki podaci'
};

setInterval(() => {
  console.log(leakyObject.data); // leakyObject ne može biti sakupljen od strane sakupljača smeća
}, 1000);
  • Velike strukture podataka:
    • Kreiranje i skladištenje prevelikih nizova ili objekata kada se mogu koristiti iteratori ili streaming.
  • Neispravno korišćenje kešova:
    • Kešovi koji rastu beskonačno bez strategije istiskivanja (LRU, LFU itd.).
  • Curenje iz eksternih biblioteka:
    • Proverite dokumentaciju ili izvorni kod biblioteka na potencijalne probleme.

Rešenje:

  1. Otkažite događaje i tajmere: Uverite se da su svi rukovaoci događaja odvojeni i tajmeri očišćeni pri uništenju komponenti ili objekta.
// Ispravno čišćenje tajmera
const leakyObject = {
  data: 'neki podaci'
};
let timerId;

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

function stopTimer() {
  clearInterval(timerId); // Očistite tajmer
}
  1. Nullifikujte reference: Izričito nullifikujte reference na velike ili neupotrebljene objekte kako bi sakupljač smeća mogao da ih sakupi.
  2. Koristite WeakMap i WeakSet: Za skladištenje referenci na objekte koje može ukloniti sakupljač smeća kada na njih nema drugih jakih referenci.
  3. Optimizujte strukture podataka: Koristite efikasnije strukture ili pristupe (npr. lenjo učitavanje).
  4. Ograničite veličinu kešova: Implementirajte strategije istiskivanja.
  5. Ažurirajte ili zamenite biblioteke: Ako je problem u eksternoj biblioteci, ažurirajte je ili pronađite alternativu.

Nakon ispravke, ponovo koristite alate za razvojne programere da biste potvrdili odsustvo curenja.