Sobes.tech
Middle

Opowiedz o metodach zbierania śmieci (Garbage Collector).

sobes.tech AI

Odpowiedź od AI

Metody zbierania śmieci:

  • Liczenie odwołań (Reference Counting): Każdy obiekt przechowuje licznik odwołań do siebie. Gdy licznik osiąga zero, obiekt jest uważany za śmieć i jest usuwany.
    • Zalety: Prosty, nie blokuje długotrwale głównego programu.
    • Wady: Nie radzi sobie z cyklicznymi odwołaniami; wymaga dodatkowej przestrzeni na licznik w każdym obiekcie.
  • Zbieracze śmieci typu tracing (Tracing Garbage Collectors): Zaczynają od zestawu "korzeni" (np. aktywnych zmiennych, stosu wywołań) i rekurencyjnie odwiedzają wszystkie obiekty dostępne z tych korzeni. Obiekty niedostępne są uważane za śmieci.
    • Główne strategie trace'owania:
      • Mark and Sweep (Oznacz i wyczyść):
        1. Oznaczanie (Mark): Przechodzenie po grafie obiektów, oznaczając dostępne obiekty.
        2. Wyczyszczenie (Sweep): Drugi przejście po pamięci, usuwając nieoznaczone obiekty.
        • Wady: Fragmentacja pamięci.
      • Mark and Compact (Oznacz i skompaktuj):
        1. Oznaczanie (Mark): Jak w Mark and Sweep.
        2. Kompaktowanie (Compact): Przesuwa żywe obiekty, aby były w sąsiedztwie, eliminując fragmentację.
        • Wady: Bardziej skomplikowane, może wymagać zatrzymania programu.
      • Kopiowanie (Copying): Dzieli pamięć na dwie części (półprzestrzenie). Podczas każdej zbiórki żywe obiekty z jednej części są kopiowane do drugiej. Następnie stara część jest całkowicie czyszczona.
        • Zalety: Brak fragmentacji, szybka alokacja pamięci po zbiórce.
        • Wady: Wymaga dwukrotnie więcej pamięci niż jest aktywnie używane.
  • Generacyjna zbiórka śmieci (Generational Garbage Collection): Opiera się na założeniu, że większość obiektów nie żyje długo. Pamięć dzieli się na pokolenia (młode, stare). Obiekty są umieszczane w młodym pokoleniu przy tworzeniu. Jeśli obiekt przeżyje kilka zbiórek w młodym pokoleniu, jest przenoszony do starego. Zbiórki w młodym pokoleniu są częstsze.
    • Zalety: Wydajna, ponieważ większość pracy wykonuje się w młodym pokoleniu z małą ilością danych.
    • Wady: Wymaga śledzenia odwołań z starszych pokoleń do młodszych (np. kart rejestracyjnych lub innych mechanizmów).

Przykłady języków i ich GC:

  • Python: Liczenie odwołań (z cyklicznym zbieraniem dla cyklicznych odwołań).
  • Java, C#: Generacyjne, Mark and Sweep, Mark and Compact, Copying (różne warianty i kombinacje w zależności od wersji i ustawień JVM/.NET).
  • Go: Współbieżny, nie generacyjny, Mark and Sweep z optymalizacjami.