Кратак одговор
Цурење меморије настаје када апликација заузме меморију и не ослободи је након употребе. Препознаје се по сталном расту потрошње меморије и успоравању. Открива се алатима за праћење меморије и анализом кода, а решава уклањањем узрока, најчешће заборављених референци.
Како се проблем препознаје
- Потрошња меморије апликације стално расте током рада
- Апликација временом успорава и постаје нестабилна
- Програм се руши са грешком недостатка меморије
- Оперативни систем почиње да користи swap и кочи се
Најчешћи узроци
Заборављене референце
Објекти остају у меморији јер на њих и даље показује референца, иако више нису потребни. То је најчешћи узрок цурења.
Неуклоњени event листенер-и
Листенер-и и callback функције који се додају без уклањања задржавају објекте у меморији. Посебно је често у дуготрајним апликацијама.
Кешеви без ограничења
Кеш који расте без границе или без истека уноса временом заузме сву доступну меморију. Исто важи за глобалне колекције.
Циклуси референци
Објекти који међусобно референцирају један другог могу остати у меморији ако гарбаге collector не може да их очисти. У језицима и окружењима која користе бројање референци циклуси су чест узрок цурења.
Решење корак по корак
- 1
Потврдите да је реч о цурењу
Покрените апликацију и пратите потрошњу меморије кроз Task Manager (Windows) или Activity Монитор (macOS). Ако меморија расте током времена, а не пада након завршетка операција, вероватно је цурење. Забележите почетну вредност и поновите исту радњу више пута.
- 2
Изолујте сценарио који изазива раст
Понављајте једну по једну функционалност (отварање екрана, учитавање података, слање захтева) и посматрајте меморију. Циљ је да пронађете најмањи низ корака који изазива стални раст. Запишите кораке да бисте касније могли да их поновите.
- 3
Користите алат за праћење меморије
У прегледачу отворите DevTools > Memory и направите хеап снапсхот пре и после сумњиве радње. Упоредите снимке и потражите објекте који остају. У Node.js користите
node --inspectи Chrome DevTools, а у .NET Висуал Studio Диагностиц Tools. - 4
Анализирајте хеап снапсхот
У алату прегледајте листу објеката сортирану по величини или броју инстанци. Обратите пажњу на објекте који bi требало да буду уклоњени. Пратите ланце референци (ретаинерс) да бисте видели шта држи објекат у меморији.
- 5
Проверите event листенер-е и тајмере
Претражите код за места где додајете листенер-е (
addEventListener,on,subscribe) и проверите да ли их уклањате (removeEventListener,off,unsubscribe). Исто важи заsetIntervalиsetTimeout, које треба зауставити помоћуclearIntervalиclearTimeoutкада више нису потребни. - 6
Ограничите кешеве и колекције
За кешеве користите ограничење величине или време истека (нпр. LRU кеш). Избегавајте глобалне низове и мапе које расту без контроле. Редовно чистите старе уносе.
- 7
Уклоните узрок и тестирајте
Након што пронађете узрок, измените код тако да се референце ослободе. Поновите исти тест и пратите меморију: треба да остане стабилна. Ако је потребно, додајте аутоматски тест који проверава да меморија не расте.
Ако ништа не помогне
Ако не можете да пронађете узрок, размотрите да поједноставите део кода који сумњате и поново тестирате. Понекад цурење потиче из библиотеке треће стране; проверите да ли је ажурирана и да ли је познат проблем. У продукцији пратите меморију кроз алате за мониторинг и поставите аларм када потрошња пређе границу. За сложене случајеве користите напредне алате као што су хеап профилер и алати за анализу алокација. Ако се цурење јавља само под оптерећењем, тестирајте са симулацијом више корисника.
Како да спречите да се понови
- Редовно прегледајте код на места где се додају листенер-и и тајмери
- Користите ограничене кешеве и чистите колекције
- Тестирајте меморију пре пуштања у продукцију
- Пратите потрошњу меморије у продукцији
Када је боље позвати стручњака
Ако цурење изазива падове у продукцији или не можете да га репродукујете, обратите се IT подршци или искуснијем девелоперу за анализу.
Развој софтвера и производа · Апликације по мери, SaaS и MVP за 4 до 8 недељаЧеста питања
Како да знам да ли апликација цури меморију или је само захтевна?
Ако меморија расте константно током рада и не ослобађа се након завршетка операција, вероватно је цурење. Захтевна апликација може користити више меморије, али bi требало да је ослободи када јој више није потребна.
Да ли је цурење меморије опасно по безбедност?
Може бити. Цурење може довести до исцрпљивања ресурса и пада система, што нападачи могу искористити за ускраћивање услуге (DoS). Такође, меморија која садржи осетљиве податке може остати дуже доступна, што повећава ризик од цурења информација.
Колико често треба проверавати меморију?
Препоручује се провера при свакој већој измени и редовно у продукцији. Аутоматизовани тестови могу помоћи да се цурење открије рано.