Сакупљач смећа (ГЦ) је менаџер меморије. Многи програмски језици имају уграђени ГЦ. Ова функција аутоматски додељује и ослобађа меморију у програму. Ослобађа завезану, неискоришћену меморију која успорава вашу апликацију.

Лепота ГЦ-а је у томе што ослобађа меморију у ваше име, без потребе да било шта чините. Стога бисте је могли сматрати тако важном карактеристиком да бисте очекивали да је има сваки програмски језик. Нажалост, то није случај; чак и популарном језику као што је Ц може недостајати ГЦ.

Како функционише додела меморије?

Када покренете програм на било ком програмском језику, ваш оперативни систем резервише а стек података у меморији за тај програм. Овај програм поседује и заузима овај стек података док не заврши извршење. Ако је вашем програму потребно више меморије него што је доступно, он може динамички да додели више меморије из гомиле меморије оперативног система.

У програмирању, променљива представља меморијску локацију. Дакле, када декларишете нову променљиву, програмски језик додељује простор у меморији за ову променљиву. Променљива ће сада имати меморијску адресу. Све док не доделите вредност овој променљивој, она ће остати неиницијализована и може садржати неку вредност за смеће.

instagram viewer

Ако вам програмски језик дозвољава да декларишете променљиву без иницијализације, онда је то динамичка променљива. То значи да се вредност коју доделите променљивој може променити током времена. Међутим, меморијска локација променљиве ће остати иста док је не ослободите.

Како функционише расподела меморије?

Алокација меморије је сличан процес за све програмске језике. Али одговарајући метод расподеле меморије има тенденцију да се разликује. Постоје две врсте метода расподеле меморије; ручне и аутоматске. ГЦ врши аутоматску делокацију.

Додела меморије без сакупљача смећа

Тхе Ц програмски језик не користи ГЦ за делокацију меморије. Стога, Ц програмери морају ручно да додељују и ослобађају меморију. Ц дозвољава динамичку алокацију меморије када не знате, у време компајлирања, колико меморије ћете користити у време извршавања.

Стандардна библиотека (стдлиб.х) садржи функције које Ц користи за управљање динамичком алокацијом меморије. Ове функције укључују:

  • маллоц(): додељује одређену величину меморије и враћа показивач на ту меморију. Ако нема довољно меморије у меморији оперативног система, враћа се нулл.
  • фрее(): додељује одређени блок меморије и враћа га у меморију оперативног система.

Ц Пример програма

#укључити
#укључити

интглавни()
{
инт *птр; // декларисање показивача
инт ј; // прогласити бројач

// додељује простор за 200 целих бројева
птр = (инт *) маллоц(200 * величина(инт));

// убацити целобројне вредности у додељену меморију
// и одштампамо сваку вредност на конзоли
за (ј = 0; ј < 200; ј++)
{
птр[ј] = ј;
принтф("%д\т",птр[ј]);
}

// ослободити претходно додељену меморију
бесплатно(птр);
повратак0;
}

Горњи код додељује меморију за складиштење 200 целобројних вредности користећи маллоц() функција. Користи показивач за приступ овој меморијској локацији и у њој чува 200 целобројних вредности. Показивач такође штампа податке сачуване на меморијској локацији на конзоли. Коначно, програм додељује претходно додељену меморију користећи бесплатно() функција.

Додела меморије са сакупљачем смећа

Неколико популарних програмских језика користи ГЦ за управљање меморијом. Ово знатно олакшава живот програмерима који користе ове језике. Ц# и Јава су два програмска језика која користе ГЦ.

Ц# ГЦ

У Ц# програмски језик, ГЦ управља алокацијом и делокацијом меморијских адреса. Стога, Ц# програмер не мора да брине о отпуштању објекта након што заврши своју сврху.

Ц# ГЦ иницијализује меморијски скуп, који се зове управљана гомила, за сваки нови процес (или програм). То зове ВиртуалАллоц() функција за додељивање меморије и ВиртуалФрее() функција да га ослободи. Најбољи део је што се све ово дешава у позадини без икаквог напора од вас, програмера.

Ц# ГЦ има механизам за оптимизацију, који користи да одлучи када ће ослободити меморију. Мотор за оптимизацију испитује корен апликације да би утврдио који објекти више нису у употреби. То ради тако што креира графикон који се протеже од корена апликације до повезаних објеката. Овај корен укључује статичка поља, локалне варијабле итд. Сваки објекат који није повезан са кореном апликације је смеће.

Мотор за оптимизацију ГЦ-а не прикупља само меморију. Прво мора постојати нови захтев за доделу меморије. Ако систем има малу количину доступне меморије, онда ће у игру ући ГЦ мотор за оптимизацију.

Јава ГЦ

У Јави, ГЦ такође управља алокацијом и делокацијом меморијских адреса. Међутим, Јава тренутно има четири различита типа подржаних сакупљача смећа:

  • Гарбаге-Фирст (Г1)
  • Сериал
  • Паралелно
  • З сакупљач смећа (ЗГЦ)

Г1 сакупљач смећа је Јава-ин подразумевани ГЦ од издавања Јава Девелопмент Кит-а (ЈДК) 9. Јава организује податке у објектима и складишти те објекте у хрпу фиксне величине. Г1 сакупљач смећа дели гомилу на регионе гомиле једнаке величине. Затим је поделио ове регионе гомиле на два дела; младе и старе генерације.

Сваки пут када креирате нови објекат, додела простора за овај објекат се дешава у младој генерацији. Користећи процес старења, Г1 сакупљач смећа копира објекте из младих региона у старе регионе. Такође копира објекте који су већ у старом региону у старију регију.

Г1 сакупљач смећа тада већину своје расподеле меморије обавља у младој генерацији, повремено се упуштајући у одељак старе генерације.

Које су предности сакупљача смећа?

Предност поседовања сакупљача смећа је то што вас спречава да размишљате о управљању меморијом док пишете свој код. Ово вам даје времена да се фокусирате на друге важне аспекте ваше апликације. Међутим, вреди истаћи неколико других предности.

Повраћај некоришћених објеката и ослобађање меморије обезбеђује чистије извршавање апликације. Ако ваш програм ослободи меморију што је пре могуће, имаће мањи меморијски отисак и моћи ће да ради ефикасније.

Сакупљање смећа смањује грешке везане за управљање меморијом, као што су цурење и грешке показивача. То је зато што процес више не зависи од програмера и његове способности да напишу тачан код.