Sobes.tech
Middle

Jak naprawiłbyś wyciek pamięci w swoim kodzie?

sobes.tech AI

Odpowiedź od AI

Czy zidentyfikowałbyś źródło wycieku za pomocą narzędzi deweloperskich przeglądarki (Timeline / Performance, Memory)?

Typowe przyczyny wycieków pamięci:

  • Zawieszone odwołania do obiektów:
    • Zapomniane timery (setInterval, setTimeout) odwołujące się do obiektów.
    • Niejasne obsługiwacze zdarzeń, które nie zostały odłączone (removeEventListener).
    • Zamknięcia, które utrzymują zewnętrzne zmienne dłużej niż to konieczne.
    • Elementy DOM usunięte z dokumentu, ale z odwołaniami w JavaScript.
// Przykład wycieku z powodu zapomnianego timera
const leakyObject = {
  data: 'some data'
};

setInterval(() => {
  console.log(leakyObject.data); // leakyObject nie może zostać zebrany przez garbage collector
}, 1000);
  • Duże struktury danych:
    • Tworzenie i przechowywanie nadmiernie dużych tablic lub obiektów, gdy można użyć iteratorów lub streamingu.
  • Nieprawidłowe użycie pamięci podręcznej:
    • Pamięci podręczne rosnące bez końca bez strategii usuwania (LRU, LFU itp.).
  • Wycieki z bibliotek zewnętrznych:
    • Sprawdzanie dokumentacji lub kodu źródłowego bibliotek pod kątem potencjalnych problemów.

Naprawa:

  1. Anulowanie zdarzeń i timerów: Upewnić się, że wszystkie obsługiwacze zdarzeń są odłączone, a timery wyczyszczone przy niszczeniu komponentu lub obiektu.
// Poprawne czyszczenie timera
const leakyObject = {
  data: 'some data'
};
let timerId;

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

function stopTimer() {
  clearInterval(timerId); // Czyszczenie timera
}
  1. Nullowanie odwołań: Wyraźnie nullować odwołania do dużych lub nieużywanych obiektów, aby garbage collector mógł je zebrać.
  2. Używanie WeakMap i WeakSet: Do przechowywania odwołań do obiektów, które mogą zostać usunięte przez garbage collector, gdy nie mają innych silnych odwołań.
  3. Optymalizacja struktur danych: Używać bardziej wydajnych struktur danych lub podejść (np. leniwa ładowanie).
  4. Ograniczenie rozmiaru pamięci podręcznej: Wprowadzić strategie usuwania.
  5. Aktualizacja lub wymiana bibliotek: Jeśli problem dotyczy biblioteki zewnętrznej, zaktualizować ją lub znaleźć alternatywę.

Po naprawie ponownie użyć narzędzi deweloperskich, aby potwierdzić brak wycieków.