Шта су цурења меморије и како их можете поправити?

Баш као што је мозак кључан за људски живот, меморија је подједнако важна и за рачунаре. Ваш систем не може да преузме задатке када нема довољно РАМ-а.

Недостатак РАМ-а и неки други проблеми са меморијом могу настати због цурења меморије. Стога ћемо показати како можете открити цурење меморије и поправити их.

Али пре тога, хајде да разумемо више о цурењу меморије и зашто би требало да их поправите.

Шта су цурења меморије?

Замислите паркинг одмах поред тржног центра, где су паркирани сви аутомобили, без обзира да ли су купци завршили куповину или не. Временом неће остати простора за паркирање нових возила, што ће довести до блокада саобраћаја и смањења укупне ефикасности тржног центра.

Извор слике: пратеекнима.медиум.цом

Исти је случај и са рачунарима!

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

Пример кода који показује цурење меморије:

void memory_allocation() {
    int *ptr = (int*)malloc(sizeof(int));
}

Исечак Ц кода изнад додељује нешто меморије за целобројну променљиву и додељује њену меморијску локацију показивачу ‘птр’. Али нема написаног кода за ослобађање меморије, што доводи до цурења меморије.

def infinite_rec():
    return infinite_rec()

У горњем Питхон коду не постоји основни случај за прекид функције. Дакле, горњи код доводи до прекорачења стека и цурења меморије.

Уобичајени узроци цурења меморије

Програмер Неглигенце

Први разлог за цурење меморије је немар програмера.

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

  Како да подесите и користите Гоогле диск на свом Мац-у

Програмер Лангуагес

Коришћење програмских језика без уграђеног система за управљање меморијом може изазвати цурење меморије.

Програмски језици као што је Јава имају уграђене сакупљаче смећа који аутоматски воде рачуна о управљању меморијом.

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

Тешка употреба кеша

Често коришћени задаци, подаци или апликације се кеширају ради бржег приступа.

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

Употреба глобалних променљивих

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

Неефикасне структуре података

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

Незатворене везе

Незатварање датотека, база података, мрежних веза, итд., након употребе такође може довести до грешака у вези са цурењем меморије.

Последице цурења меморије

Ниске перформансе – Видећете постепено смањење перформанси ваше апликације или система како се цурење меморије гомила. То је зато што неће бити доступне меморије за извршавање задатака, што успорава вашу апликацију.

Срушене апликације – Апликацијама понестаје меморије како цурење меморије расте. У неком тренутку, без доступне меморије, програм се руши, што доводи до губитка података и отказивања апликације.

Безбедносне рањивости – Неправилно брисање осетљивих података попут лозинки, личних података или поверљивих информација из меморије након употребе излаже ове податке нападачима током цурења меморије.

Исцрпљеност ресурса – Апликације заузимају више простора у РАМ-у када им понестане меморије због цурења меморије. Ово повећава потрошњу ресурса и смањује укупне перформансе система.

Како открити цурење меморије?

Ручна инспекција кода

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

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

Статичка анализа кода

Различити добро дизајнирани алати за статичку анализу анализирају изворни код компајлера и откривају случајеве цурења меморије.

  Како да поправите Убунту грешку „Није пронађен Ви-Фи адаптер“.

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

Алатке за динамичку анализу

Ови алати користе динамички приступ за анализу кода током извршавања и откривање цурења меморије.

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

Алати за профилисање

Алати за профилисање вам дају увид у то како апликација користи меморију.

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

Библиотеке за откривање цурења меморије

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

На пример, Јава има сакупљач смећа који се бави меморијом, а Ц++ нуди ЦртДбг за управљање меморијом.

Такође, специјализоване библиотеке попут ЛеакЦанари, Валгринд, ИоурКит, итд., адресирају цурење меморије у различитим типовима апликација.

Како поправити цурење меморије?

Идентификујте цурење меморије

Да бисте поправили цурење меморије, прво их морате идентификовати.

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

Идентификујте објекте који узрокују цурење

Када потврдите да апликација цури меморију у горњем кораку, требало би да потражите објекте и структуре података који узрокују цурење. Схватите како им се додељује меморија и где би требало да ослободе меморију.

Креирајте тест случајеве

Сада сте сузили тачно место цурења меморије. Дакле, направите тест случај да бисте били сигурни да сте исправно идентификовали извор цурења меморије и да бисте потврдили да цурење нестаје када поправите те специфичне објекте.

Поправи код

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

Тест Агаин

Опет, користите алате за откривање цурења или аутоматизоване тестове да бисте проверили да ли апликација ради како је предвиђено и да ли нема блокаде меморије.

Такође, тестирајте перформансе и функционалност ваше апликације да бисте били сигурни да ажурирање кода не утиче на друге факторе апликације.

  Снажан алат за снимање екрана и видео записа

Најбоље праксе за спречавање цурења меморије

Будите одговорни програмер

Требало би да будете свесни ослобађања коришћене меморије или отпуштања меморијских показивача док пишете сам код. Ово ће минимизирати проблеме са цурењем меморије.

Сећате се кода испод? Као што је поменуто на почетку чланка, не постоји исечак кода за делокацију меморије, тако да то доводи до цурења меморије.

void memory_allocation() {
    int *ptr = (int*)malloc(sizeof(int));
}

Ево како ви, као програмер, можете ослободити меморију.

delete ptr;

Користите опремљене програмске језике

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

Иако превиђате неколико случајева, ови уграђени алати њима управљају, спречавајући потенцијално цурење меморије.

Стога вам препоручујем да користите такве програмске језике у којима је управљање меморијом уграђено.

Цирцулар Референцес

Избегавајте кружне референце у свом програму.

Кружне референце прате затворену петљу објеката који се односе једни на друге. На пример, објекат а се односи на б, објекат б се односи на ц, а објекат ц се поново односи на а, без краја у петљи. Дакле, кружне референце воде до бесконачне петље, узрокујући цурење меморије.

Минимизирајте употребу глобалних променљивих

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

Дакле, пређите на локалне варијабле. Они су ефикасни у меморији јер ослобађају меморију када се позив функције заврши.

Глобалне варијабле изгледају следеће, али их користе само када је потребно.

int x = 5 // Global variable
void func(){
    print(x)
}

Али користите локалне варијабле на следећи начин:

void func(){
    int x = 5 // Local variable
    print(x)
}

Ограничите кеш меморију

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

Дакле, ограничавање кеша може спречити цурење меморије.

Тестирајте добро

Укључите тестове цурења меморије у своју фазу тестирања.

Направите аутоматизоване тестове и покријте све крајње случајеве да бисте открили цурење меморије пре него што пустите код у производњу.

Опремите алате за праћење

Користите алатке за аутоматско профилисање да надгледате употребу меморије. Редовно праћење употребе меморије помаже вам да идентификујете потенцијална цурења и да их поправите унапред.

Висуал Студио профилер, НЕТ Мемори профилер и ЈПрофилер су неколико добрих алата у овом контексту.

Закључак

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

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

Затим можете истражити како да поправите грешку „недостатак меморије“ у Виндовс-у у року од 5 минута.