Sobes.tech
Middle

Дар бораи усулҳои ҷамъоварии хога (Garbage Collector) нақл кунед.

sobes.tech AI

Ҷавоб аз AI

Методи за збирання сміття:

  • Reference Counting (Підрахунок посилань): Кожен об'єкт зберігає лічильник посилань на себе. Коли лічильник досягає нуля, об'єкт вважається сміттям і видаляється.
    • Переваги: Простий, не блокує виконання основної програми надовго.
    • Недоліки: Не справляється з циклічними посиланнями; вимагає додатковий простір для лічильника в кожному об'єкті.
  • Tracing Garbage Collectors (Трасуючі збирачі сміття): Починають з набору "кореневих" об'єктів (наприклад, активних змінних, стеку викликів) і рекурсивно обходять всі об'єкти, доступні з цих коренів. Недоступні об'єкти вважаються сміттям.
    • Основні стратегії трасування:
      • Mark and Sweep (Марк і змив):
        1. Mark (Марк): Прохід по графу об'єктів і позначення всіх доступних об'єктів.
        2. Sweep (Змив): Другий прохід по пам'яті, видаляючи всі непозначені об'єкти.
        • Недоліки: Фрагментація пам'яті.
      • Mark and Compact (Марк і стиснення):
        1. Mark (Марк): Як у Mark and Sweep.
        2. Compact (Стиснення): Переміщує живі об'єкти так, щоб вони розташовувалися безперервно, усуваючи фрагментацію.
        • Недоліки: Більш складний, може вимагати зупинки виконання програми.
      • Copying (Копіювання): Пам'ять ділиться на дві області (напівпростори). В кожній ітерації збору сміття живі об'єкти з однієї області копіюються в іншу. Потім стара область повністю очищується.
        • Переваги: Відсутність фрагментації, швидка алокація пам'яті після збору.
        • Недоліки: Потрібно вдвічі більше пам'яті, ніж активно використовується.
  • Generational Garbage Collection (Генераційне збирання сміття): Ґрунтується на гіпотезі, що більшість об'єктів живе недовго. Пам'ять ділиться на покоління (молоде, старе). Об'єкти поміщаються у молоде покоління при створенні. Якщо об'єкт "виживає" кілька зборів у молодому поколінні, він переміщується у старе. Збір сміття відбувається частіше у молодому поколінні.
    • Переваги: Ефективний, оскільки більша частина роботи виконується у молодому поколінні з малим обсягом даних.
    • Недоліки: Вимагає відстеження посилань із старих поколінь на молоді (наприклад, за допомогою карток запису або інших механізмів).

Приклади мов і їх GC:

  • Python: Reference Counting (з циклічним збиранням для циклічних посилань).
  • Java, C#: Generational, Mark and Sweep, Mark and Compact, Copying (різні варіанти і комбінації залежно від конкретної версії та налаштувань JVM/.NET).
  • Go: Concurrent, non-generational Mark and Sweep з оптимізаціями.