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ść):
- Oznaczanie (Mark): Przechodzenie po grafie obiektów, oznaczając dostępne obiekty.
- Wyczyszczenie (Sweep): Drugi przejście po pamięci, usuwając nieoznaczone obiekty.
- Wady: Fragmentacja pamięci.
- Mark and Compact (Oznacz i skompaktuj):
- Oznaczanie (Mark): Jak w Mark and Sweep.
- 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.
- Mark and Sweep (Oznacz i wyczyść):
- Główne strategie trace'owania:
- 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.