Ця стаття не містить . (листопад 2015) |
Витік пам'яті (англ. memory leak) — процес неконтрольованого зменшення обсягу вільної оперативної пам'яті або віртуальної пам'яті комп'ютера, пов'язаний з помилками в програмах, що вчасно не звільняють пам'ять від непотрібних даних, або з помилками системних служб контролю пам'яті.
Витік пам'яті найчастіше зустрічається у мовах програмування, які надають користувачеві можливість самому керувати пам'яттю комп'ютера.
Опис
Виконання наведеного коду на призводить до витоку пам'яті:
/*1*/ int *pointer = NULL; /*2*/ for (int i = 0; i < 10; i++) { /*3*/ pointer = new int[100]; /*4*/ } /*5*/ delete [] pointer;
На кожній ітерації циклу виділяється пам'ять для 100 цілих чисел типу int і адреса виділеної пам'яті записується у змінну pointer, затираючи адресу попереднього виділеного блоку пам'яті. У 5-му рядку відбувається видалення об'єкта, створеного на останній ітерації циклу. Усі попередні 9 об'єктів залишаються в динамічній пам'яті. До них неможливо ні отримати доступ з програми, ні видалити, оскільки немає змінних, які б зберігали їх адреси.
Небезпека
Динамічна пам'ять є обмеженим ресурсом. Керування динамічною пам'яттю програми зазвичай здійснюється бібліотекою мови програмування, яка сама працює поверх динамічної пам'яті, що надається операційною системою.
Витоки пам'яті призводять до того, що споживання пам'яті програмою неконтрольовано зростає, внаслідок чого рано чи пізно вступають у дію архітектурні обмеження середовища виконання (операційної системи, віртуальної машини, комп'ютера), і тоді нове виділення пам'яті стає неможливим. У цій ситуації у програмі, яка запитує пам'ять, зазвичай відбувається аварійна зупинка. Це може за збігом обставин відбутися і зовсім з іншою програмою після того, як програма, підвладна витокам, вичерпає всю пам'ять машини.
Способи запобігання
Існують різні способи запобігання витокам пам'яті.
Відмова від динамічної пам'яті
Наприклад, FORTRAN-77 повністю відмовляється від застосування механізмів динамічного розподілу пам'яті, що виключає подібні помилки, але істотно обмежує функціональність програм.
Розумні вказівники
Розумні вказівники дозволяють дещо узгодити час життя вказівника і час життя об'єкта, на який він посилається.
Прибирання сміття
Деякі мови програмування (наприклад, Оберон, Java, мови для CLI) надають засоби, що дозволяють автоматично звільняти невикористану пам'ять. Збирачі сміття вирішують також і проблему циклічних посилань, але збірка сміття є ресурсомісткою операцією. За використання подібних засобів доводиться розплачуватися швидкодією системи, і, головне, прибирання сміття вносить несподівані паузи у роботу програми, що неприпустимо в системах реального часу.
Прибирання сміття було винайдене Джоном Маккарті приблизно у 1959 році при розробці мови програмування LISP, структура якої робить вкрай складним ручне керування пам'яттю.
Перезапуск програми
У тих випадках, коли усунути витік пам'яті не є можливим, наприклад, при використанні коду, який надається у вигляді програмних модулів і виготовленого сторонніми розробниками, застосовують своєрідний спосіб ігнорування витоків. Код, схильний до витоків, розміщують в окремій програмі, а цю програму з потрібною періодичністю перезапускають. Запуски і перезапуски програми виконуються зовнішньою програмою, яка також подає вихідні дані і забирає результати. Оскільки при завершенні програми вся пам'ять, затребувана нею в операційної системи, повертається операційній системі, такий метод не дозволяє витокам набути катастрофічного характеру.
Витік інших ресурсів
Також існує помилка, що іменується : захоплені дескриптори не повертаються операційній системі.
Для боротьби з наслідками таких помилок розробники операційних систем вводять у них функціональність, що дозволяє обмежувати обсяг пам'яті, кількість дескрипторів і кількість процесорного часу, доступного одному користувачеві або конкретному процесу.
Виявлення витоків
Для професійних мов програмування існують спеціальні програми-профілювальники, що дозволяють виявити зокрема і витоки пам'яті.
Для деяких мов програмування існують статичні аналізатори коду, що виявляють елементи програми, потенційно здатні призводити до логічних помилок, зокрема і до витоку пам'яті. Примітивний варіант такого аналізатора реалізує практично будь-який компілятор мови високого рівня, у вигляді видачі так званих попереджень (warnings) — повідомлень про наявність у програмі конструкцій, які формально не порушують синтаксису мови, але потенційно помилкові.
Існують бібліотеки для [en], які допомагають стежити за виділенням та звільненням пам'яті під час роботи програми.
Див. також
Це незавершена стаття про програмування. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Cya stattya ne mistit posilan na dzherela Vi mozhete dopomogti polipshiti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Material bez dzherel mozhe buti piddano sumnivu ta vilucheno listopad 2015 Vitik pam yati angl memory leak proces nekontrolovanogo zmenshennya obsyagu vilnoyi operativnoyi pam yati abo virtualnoyi pam yati komp yutera pov yazanij z pomilkami v programah sho vchasno ne zvilnyayut pam yat vid nepotribnih danih abo z pomilkami sistemnih sluzhb kontrolyu pam yati Vitik pam yati najchastishe zustrichayetsya u movah programuvannya yaki nadayut koristuvachevi mozhlivist samomu keruvati pam yattyu komp yutera OpisVikonannya navedenogo kodu na C prizvodit do vitoku pam yati 1 int pointer NULL 2 for int i 0 i lt 10 i 3 pointer new int 100 4 5 delete pointer Na kozhnij iteraciyi ciklu vidilyayetsya pam yat dlya 100 cilih chisel tipu int i adresa vidilenoyi pam yati zapisuyetsya u zminnu pointer zatirayuchi adresu poperednogo vidilenogo bloku pam yati U 5 mu ryadku vidbuvayetsya vidalennya ob yekta stvorenogo na ostannij iteraciyi ciklu Usi poperedni 9 ob yektiv zalishayutsya v dinamichnij pam yati Do nih nemozhlivo ni otrimati dostup z programi ni vidaliti oskilki nemaye zminnih yaki b zberigali yih adresi NebezpekaDinamichna pam yat ye obmezhenim resursom Keruvannya dinamichnoyu pam yattyu programi zazvichaj zdijsnyuyetsya bibliotekoyu movi programuvannya yaka sama pracyuye poverh dinamichnoyi pam yati sho nadayetsya operacijnoyu sistemoyu Vitoki pam yati prizvodyat do togo sho spozhivannya pam yati programoyu nekontrolovano zrostaye vnaslidok chogo rano chi pizno vstupayut u diyu arhitekturni obmezhennya seredovisha vikonannya operacijnoyi sistemi virtualnoyi mashini komp yutera i todi nove vidilennya pam yati staye nemozhlivim U cij situaciyi u programi yaka zapituye pam yat zazvichaj vidbuvayetsya avarijna zupinka Ce mozhe za zbigom obstavin vidbutisya i zovsim z inshoyu programoyu pislya togo yak programa pidvladna vitokam vicherpaye vsyu pam yat mashini Sposobi zapobigannyaIsnuyut rizni sposobi zapobigannya vitokam pam yati Vidmova vid dinamichnoyi pam yati Napriklad FORTRAN 77 povnistyu vidmovlyayetsya vid zastosuvannya mehanizmiv dinamichnogo rozpodilu pam yati sho viklyuchaye podibni pomilki ale istotno obmezhuye funkcionalnist program Rozumni vkazivniki Dokladnishe Rozumni vkazivniki Rozumni vkazivniki dozvolyayut desho uzgoditi chas zhittya vkazivnika i chas zhittya ob yekta na yakij vin posilayetsya Pribirannya smittya Dokladnishe Zbirannya smittya Deyaki movi programuvannya napriklad Oberon Java movi dlya CLI nadayut zasobi sho dozvolyayut avtomatichno zvilnyati nevikoristanu pam yat Zbirachi smittya virishuyut takozh i problemu ciklichnih posilan ale zbirka smittya ye resursomistkoyu operaciyeyu Za vikoristannya podibnih zasobiv dovoditsya rozplachuvatisya shvidkodiyeyu sistemi i golovne pribirannya smittya vnosit nespodivani pauzi u robotu programi sho nepripustimo v sistemah realnogo chasu Pribirannya smittya bulo vinajdene Dzhonom Makkarti priblizno u 1959 roci pri rozrobci movi programuvannya LISP struktura yakoyi robit vkraj skladnim ruchne keruvannya pam yattyu Perezapusk programi U tih vipadkah koli usunuti vitik pam yati ne ye mozhlivim napriklad pri vikoristanni kodu yakij nadayetsya u viglyadi programnih moduliv i vigotovlenogo storonnimi rozrobnikami zastosovuyut svoyeridnij sposib ignoruvannya vitokiv Kod shilnij do vitokiv rozmishuyut v okremij programi a cyu programu z potribnoyu periodichnistyu perezapuskayut Zapuski i perezapuski programi vikonuyutsya zovnishnoyu programoyu yaka takozh podaye vihidni dani i zabiraye rezultati Oskilki pri zavershenni programi vsya pam yat zatrebuvana neyu v operacijnoyi sistemi povertayetsya operacijnij sistemi takij metod ne dozvolyaye vitokam nabuti katastrofichnogo harakteru Vitik inshih resursivTakozh isnuye pomilka sho imenuyetsya zahopleni deskriptori ne povertayutsya operacijnij sistemi Dlya borotbi z naslidkami takih pomilok rozrobniki operacijnih sistem vvodyat u nih funkcionalnist sho dozvolyaye obmezhuvati obsyag pam yati kilkist deskriptoriv i kilkist procesornogo chasu dostupnogo odnomu koristuvachevi abo konkretnomu procesu Viyavlennya vitokivDlya profesijnih mov programuvannya isnuyut specialni programi profilyuvalniki sho dozvolyayut viyaviti zokrema i vitoki pam yati Dlya deyakih mov programuvannya isnuyut statichni analizatori kodu sho viyavlyayut elementi programi potencijno zdatni prizvoditi do logichnih pomilok zokrema i do vitoku pam yati Primitivnij variant takogo analizatora realizuye praktichno bud yakij kompilyator movi visokogo rivnya u viglyadi vidachi tak zvanih poperedzhen warnings povidomlen pro nayavnist u programi konstrukcij yaki formalno ne porushuyut sintaksisu movi ale potencijno pomilkovi Isnuyut biblioteki dlya en yaki dopomagayut stezhiti za vidilennyam ta zvilnennyam pam yati pid chas roboti programi Div takozhZavisli vkazivniki Ce nezavershena stattya pro programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi