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

Красотата на GC е, че освобождава памет от ваше име, без да е необходимо да правите каквото и да било. Следователно може да го смятате за толкова съществена характеристика, че бихте очаквали всеки език за програмиране да го има. За съжаление, това не е така; дори популярен език като C може да няма GC.

Как работи разпределението на паметта?

Когато изпълнявате програма на който и да е език за програмиране, вашата операционна система запазва a стек от данни в паметта за тази програма. Тази програма притежава и заема този стек от данни, докато не завърши изпълнението. Ако вашата програма се нуждае от повече памет от наличната, тя може динамично да разпредели повече памет от паметта на операционната система.

В програмирането променливата представлява място в паметта. Така че, когато декларирате нова променлива, езикът за програмиране разпределя място в паметта за тази променлива. Сега променливата ще има адрес в паметта. Докато не присвоите стойност на тази променлива, тя ще остане неинициализирана и може да съдържа някаква ненужна стойност.

instagram viewer

Ако езикът за програмиране ви позволява да декларирате променлива без да я инициализирате, тогава това е динамична променлива. Това означава, че стойността, която присвоявате на променливата, може да се промени с времето. Местоположението в паметта на променливата обаче ще остане същото, докато не я освободите.

Как работи освобождаването на паметта?

Разпределението на паметта е подобен процес за всички езици за програмиране. Но съответният метод за освобождаване на памет има тенденция да се различава. Има два вида методи за освобождаване на памет; ръчни и автоматични. GC прави автоматично освобождаване.

Освобождаване на паметта без събирач на отпадъци

The Език за програмиране C не използва GC за освобождаване на памет. Следователно C програмистите трябва ръчно да разпределят и освобождават памет. C позволява динамично разпределение на паметта, когато не знаете, по време на компилиране, колко памет ще използвате по време на изпълнение.

Стандартната библиотека (stdlib.h) съдържа функциите, които C използва за управление на динамичното разпределение на паметта. Тези функции включват:

  • malloc(): заделя определен размер памет и връща указател към тази памет. Ако няма достатъчно налична памет в пула памет на операционната система, той връща null.
  • free(): освобождава определен блок памет и го връща в пула памет на операционната система.

Пример за C програма

#включват
#включват

вътросновен()
{
вътр *ptr; // деклариране на указател
вътр j; // деклариране на брояч

// заделя място за 200 цели числа
ptr = (вътр *) malloc(200 * размер на(вътр));

// вмъкнете цели числа в разпределената памет
// и отпечата всяка стойност на конзолата
за (j = 0; j < 200; j++)
{
ptr[j] = j;
printf("%d\t",ptr[j]);
}

// освобождаване на предварително разпределената памет
Безплатно(ptr);
връщане0;
}

Кодът по-горе разпределя памет за съхраняване на 200 цели числа, използвайки malloc() функция. Той използва указател за достъп до това място в паметта и съхранява 200 цели числа в него. Показалецът също отпечатва данните, съхранени в мястото на паметта, на конзолата. Накрая програмата освобождава предварително разпределената памет с помощта на Безплатно() функция.

Освобождаване на памет с Garbage Collector

Няколко популярни езика за програмиране използват GC за управление на паметта. Това прави живота на програмистите, които използват тези езици, много по-лесен. C# и Java са два езика за програмиране, които използват GC.

C# GC

В Език за програмиране C#, GC управлява разпределението и освобождаването на адреси на паметта. Следователно програмистът на C# не трябва да се тревожи за освобождаването на обект, след като изпълни целта си.

C# GC инициализира пул памет, наречен управлявана купчина, за всеки нов процес (или програма). Извиква VirtualAlloc() функция за разпределяне на памет и VirtualFree() функция за освобождаването му. Най-добрата част е, че всичко това се случва във фонов режим, без да се изискват усилия от вас, програмиста.

C# GC има оптимизираща машина, която използва, за да реши кога да освободи памет. Оптимизиращата машина проверява корена на приложението, за да определи кои обекти вече не се използват. Той прави това чрез създаване на графика, която се простира от основата на приложението до свързаните обекти. Този корен включва статични полета, локални променливи и т.н. Всеки обект, който не е свързан с корена на приложението, е боклук.

GC оптимизиращата машина не просто събира памет сама. Първо трябва да има нова заявка за разпределение на паметта. Ако системата има малък обем налична памет, тогава ще влезе в действие GC оптимизиращата машина.

Java GC

В Java GC също управлява разпределението и освобождаването на адреси на паметта. В момента обаче Java има четири различни типа поддържани събирачи на отпадъци:

  • Първо боклук (G1)
  • Сериен
  • Паралелен
  • Z събирач на боклук (ZGC)

Колекторът за боклук G1 е GC по подразбиране на Java от пускането на Java Development Kit (JDK) 9. Java организира данни в обекти и съхранява тези обекти в купчина с фиксиран размер. Колекторът за боклук G1 разделя купчината на купчини с еднакъв размер. След това разделя тези области на купчина на две секции; млади и стари поколения.

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

След това G1 събирачът на боклук извършва по-голямата част от освобождаването на паметта си в младото поколение, като от време на време се осмелява да отиде в раздела на старото поколение.

Какви са ползите от наличието на боклукчия?

Ползата от наличието на събирач на отпадъци е, че ви предпазва от мислене за управление на паметта, докато пишете кода си. Това ви дава време да се съсредоточите върху другите важни аспекти на вашето приложение. Въпреки това си струва да се подчертаят няколко други предимства.

Възстановяването на неизползвани обекти и освобождаването на памет осигурява по-чисто изпълнение на приложението. Ако вашата програма освободи памет възможно най-скоро, тя ще има по-малък отпечатък от паметта и ще може да работи по-ефективно.

Събирането на боклука намалява грешките, свързани с управлението на паметта, като изтичане на данни и грешки на показалеца. Това е така, защото процесът вече не зависи от програмиста и неговата способност да пише точен код.