Събирането на отпадъци е метод за автоматично освобождаване на памет, която вече не се използва от програма. Той работи, като идентифицира обекти в паметта, които вече не са достъпни от програмата, и след това възстановява паметта, използвана от тези обекти. Това се прави от събирач на боклук, който е програма или алгоритъм, който работи във фонов режим, като наблюдава използването на паметта и освобождава памет, ако е необходимо.

Защо имаме нужда от събиране на отпадъци?

  1. Управление на паметта: Събирането на боклук автоматизира процеса на освобождаване на памет, която вече не се използва от програма, което може да помогне за предотвратяване на изтичане на памет и други проблеми, свързани с паметта.
  2. Опростяване на кода: Без събиране на боклук, разработчиците ще трябва ръчно да управляват разпределението и освобождаването на паметта в своя код. Това може да бъде сложно и податливо на грешки и може да направи кода по-труден за четене и разбиране.
  3. Подобрена производителност: Събирането на боклук може да помогне за подобряване на производителността на програма чрез възстановяване на памет, която вече не се използва, което може да помогне за предотвратяване на изчерпване на паметта и срив на програмата.
  4. По-добро използване на ресурсите: Събирането на отпадъци може да гарантира, че системните ресурси се използват ефективно, като освобождава памет, която вече не е необходима. Това може да бъде особено важно в среди с ограничени ресурси като мобилни устройства или вградени системи.
  5. Подобрена мащабируемост: Събирането на боклука може да помогне за подобряване на мащабируемостта на програма, като й позволи да продължи да работи дори когато количеството данни, които трябва да обработи, се увеличи.

Алгоритми за събиране на боклук в програмирането?

Съществуват няколко вида събиране на боклука, всеки със собствен набор от предимства и недостатъци. Някои от по-често срещаните видове включват:

  1. Преброяване на препратки: Този метод за събиране на боклук присвоява преброяване на препратки към всеки обект в паметта и освобождава паметта на обект, когато броят на препратките достигне нула.
  2. Маркиране и почистване: Този метод за събиране на отпадъци периодично „маркира“ всички обекти в паметта, които се използват в момента, и след това „помита“, за да възстанови паметта на всички обекти, които не са били маркирани.
  3. Копиране: Този метод за събиране на отпадъци разделя паметта на две равни части и копира всички живи обекти от едната половина в другата. След това половината, съдържаща мъртвите обекти, се освобождава.
  4. Поколенчески: Този метод за събиране на отпадъци предполага, че повечето обекти умират млади и разделя паметта на различни поколения за обекти с различна възраст. По-ефективно е да проверявате за боклук в младото поколение, отколкото в старото поколение.
  5. Едновременно: Този метод за събиране на боклук работи паралелно с програмата, което позволява на програмата да продължи да работи, докато събирачът на боклук работи.
  6. Инкрементално/в реално време: Този метод за събиране на боклук разделя процеса на събиране на боклук на малки части, които могат да бъдат разпределени във времето. Това може да помогне за намаляване на въздействието на събирането на боклук върху производителността на програмата.

Всеки тип алгоритъм за събиране на отпадъци има свои собствени компромиси и е по-подходящ за определени случаи на употреба от други.

Два най-популярни алгоритъма са

Броенето на препратки е метод за събиране на боклука, при който на всеки обект в паметта се присвоява преброяване на препратки, което е броят препратки към този обект от други части на програмата. Когато броят на препратките на обект достигне нула, той се счита, че вече не се използва и паметта му се освобождава. Този метод е лесен за прилагане и може да бъде ефективен в определени ситуации, но също така може да доведе до „изтичане на памет“, когато обектите вече не са необходими, но броят на референтните им данни никога не се намалява.

Mark-and-sweep е метод за събиране на боклук, който включва периодично „маркиране“ на всички обекти в паметта, които се използват в момента, и след това „почистване“, за да се възстанови паметта на всички обекти, които не са били маркирани. Този метод е по-сложен за изпълнение от преброяването на препратки, но е по-малко склонен към изтичане на памет. Mark-and-sweep също е по-гъвкав алгоритъм в смисъл, че може да обработва по-сложни сценарии за управление на паметта като кръгови препратки, при които два или повече обекта се препращат един към друг.