Збирання сміття (англ. garbage collection) — одна з форм автоматичного керування оперативною пам'яттю комп'ютера під час виконання програм. Підпрограма — «прибиральник сміття» — вивільняє пам'ять від об'єктів, які не використовуватимуться програмою надалі. Збирання сміття було винайдено Джоном Маккарті приблизно 1959 року для розробленої ним мови програмування Lisp.
Історія
Прибирання сміття вперше застосував Джон Маккарті 1959 року в середовищі програмування на розробленій ним функціональній мові програмування Lisp. Згодом воно застосовувалося в інших системах програмування і мовах, переважно — у функційних та логічних. Необхідність збирання сміття в мовах цих типів обумовлена тим, що структура таких мов робить украй незручним відстеження часу життя об'єктів у пам'яті й ручне керування нею. У цих мовах широко використовуються списки і засновані на них складні структури даних під час роботи програм постійно створюються, надбудовуються, розширюються, копіюються, і правильно визначити момент видалення того чи іншого об'єкта важко.
У промислових процедурних і об'єктних мовах прибирання сміття довго не використовувалася. Перевага віддавалася ручному керуванню пам'яттю, як більш ефективному та передбачуваному. Але з другої половини 1980-х років технологія збирання сміття стала використовуватися і в директивних (імперативних), і в об'єктних мовах програмування, а з другої половини 1990-х років усе більше число створюваних мов і середовищ, орієнтованих на прикладне програмування, містять механізм збору сміття або як єдиний, або як один з доступних механізмів керування динамічною пам'яттю. Нині[] вона використовується мовами Оберон, Java, Python, Ruby, Perl, C#, D, F # та іншими мовами.
Основний принцип, з яким працюють різні алгоритми збирання сміття, полягає в наступному:
- Визначити об'єкти, що не потрібні для подальшої роботи програми.
- Вивільнити ресурси, зайняті цими об'єктами.
Часто автоматичне збирання сміття протиставляють ручному керуванню пам'яттю, яке, на відміну від автоматичного, вимагає від розробника самому писати інструкції виділення пам'яті та її звільнення.
цієї статті під сумнівом. (Червень 2012) |
Проблеми ручного керування пам'яттю
Традиційним для директивних мов способом керування пам'яттю є ручний. Його сутність у такому:
- Для створення об'єкта в динамічної пам'яті програміст явно викликає команду виділення пам'яті. Ця команда повертає вказівник на виділену ділянку пам'яті, який зберігається і використовується для доступу до неї.
- До тих пір, поки створений об'єкт потрібен для роботи програми, програма звертається до нього через раніше збережений вказівник.
- Коли потреба в об'єкті зникає, програміст явно викликає команду звільнення пам'яті, передаючи їй вказівник на створений об'єкт.
У будь-якій мові, що допускає створення об'єктів у динамічній пам'яті, потенційно можливі дві проблеми: завислі вказівники і витоки пам'яті .
- Завислий вказівник
- Завислий вказівник — це вказівник, який залишається у використанні для посилання на об'єкт, який уже видалений. Після видалення об'єкта всі збережені в програмі посилання на нього стають «завислими». Пам'ять, займана раніше об'єктом, може бути передана операційній системі і стати недоступною, або бути використана для розміщення нового об'єкта в тій самій програмі. У першому випадку спроба звернутися по «повислого» вказівника призведе до спрацьовування механізму захисту пам'яті й аварійної зупинки програми, а в другому — до непередбачуваних наслідків.
- Поява завислих посилань зазвичай стає наслідком неправильної оцінки часу життя об'єкта: програміст викликає команду видалення об'єкта до того, як його використання припиниться.
- Витік пам'яті
- Створивши об'єкт у динамічній пам'яті, програміст може не видалити його після завершення використання. Якщо на об'єкт немає посилань, він стає програмно недоступним, але продовжує займати пам'ять, оскільки команда його видалення не викликана. Ця ситуація і називається витоком пам'яті.
- Якщо об'єкти, посилання на які губляться, створюються в програмі постійно, то витік пам'яті проявляється в поступовому збільшенні обсягу використовуваної пам'яті; якщо програма працює довго, обсяг використовуваної нею пам'яті постійно зростає, і через якийсь час відчутно сповільнюється робота системи (через необхідність під час будь-якого виділення пам'яті використовувати підкачування сторінок), або програма вичерпує доступний обсяг адресного простору і завершується з помилкою.
Вплив автоматичного збирання сміття на швидкодію
Дослідження впливу автоматичного збирання сміття на швидкодію програм для мов програмування, розроблених для застосування лише разом з автоматичним збиранням сміття (таких як Java, Objective Caml, Python тощо), ускладнюється браком можливості вимірювати швидкодію програми з ручним керуванням пам'яттю. Однак, у дослідженні Метью Герца та Емері Берґера порівняно швидкодію ручного керування пам'яттю та прибиральників сміття (як з копіюванням, так і без копіювання). Ці вимірювання довели, що найкращий за швидкодією прибиральник сміття може конкурувати за швидкодією з ручним керуванням пам'яттю, якщо йому надати досить багато пам'яті. Зокрема, з використанням уп'ятеро більшої пам'яті його швидкодія відповідає ручному варіанту. За наявності втричі більшої вільної пам'яті він працює в середньому на 17 % повільніше за ручне керування пам'яттю. А з використанням удвічі більшої пам'яті, швидкодія зменшується на 70 %. В умовах браку фізичної пам'яті використання вповільнює швидкодію прибиральника сміття в рази порівняно з ручним керуванням.
Вимоги до мови та системи
Щоб програма могла використовувати збирання сміття, необхідно виконання низки умов, що належать до мови, середовища виконання і самої розв'язуваної задачі.
- Необхідність середовища виконання зі збирача сміття
- Природно, для збору сміття необхідне динамічне середовище, що підтримує виконання програми, і наявність у цьому середовищі збирача сміття.
- Підтримка з боку мови програмування
Збирач сміття може нормально функціонувати тільки тоді, коли він може точно відстежити всі посилання на всі створені об'єкти. Очевидно, якщо мова допускає перетворення посилань (вказівників) в інші типи даних (цілі числа, масиви байтів і так далі) на кшталт С/, відстежити використання таких перетворених посилань стає неможливо, і збирання сміття стає безглуздим — вона не захищає від «завислих» вказівників і витоків пам'яті. Тому мови, орієнтовані на використання збирання сміття, зазвичай істотно обмежують свободу використання вказівників, адресної арифметики, перетворень типів вказівників до інших типів даних. У частині з них узагалі немає типу даних «вказівник», у частині він є, але не допускає ні перетворень типу, ні зміни.
- Технічна допустимість короткочасних уповільнень у роботі програм
- Прибирання сміття виконується періодично зазвичай у заздалегідь невідомі моменти часу. Якщо припинення роботи програми на час, порівнянний із часом збирання сміття, може призвести до критичних помилок, використовувати в подібній ситуації збирання сміття, очевидно, не можна.
- Наявність деякого резерву вільної пам'яті
- Чим більше пам'яті доступно середовищі виконання, тим рідше запускається збирач сміття і тим ефективніше його робота. Робота збирача сміття в системі, де кількість доступної збирачеві пам'яті наближається до пікової потреби програми, може виявитися неефективною і непродуктивною. Чим менше надлишок пам'яті, тим частіше відбувається запуск збирача і тим більше часу витрачається на його виконання. Падіння продуктивності програми в такому режимі може виявитися занадто істотним.
Примітки
- Шеховцов В. А. 10.6. Підрахунок посилань і збирання сміття. Операційні системи. BHV Publishing Group. с. 246. ISBN .
- Recursive functions of symbolic expressions and their computation by machine, Part I
- Matthew Hertz and Emery D. Berger. Quantifying the Performance of Garbage Collection vs. Explicit Memory Management. з джерела 27 лютого 2012. Процитовано 4 червня 2012.
Див. також
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Zbirannya smittya angl garbage collection odna z form avtomatichnogo keruvannya operativnoyu pam yattyu komp yutera pid chas vikonannya program Pidprograma pribiralnik smittya vivilnyaye pam yat vid ob yektiv yaki ne vikoristovuvatimutsya programoyu nadali Zbirannya smittya bulo vinajdeno Dzhonom Makkarti priblizno 1959 roku dlya rozroblenoyi nim movi programuvannya Lisp IstoriyaPribirannya smittya vpershe zastosuvav Dzhon Makkarti 1959 roku v seredovishi programuvannya na rozroblenij nim funkcionalnij movi programuvannya Lisp Zgodom vono zastosovuvalosya v inshih sistemah programuvannya i movah perevazhno u funkcijnih ta logichnih Neobhidnist zbirannya smittya v movah cih tipiv obumovlena tim sho struktura takih mov robit ukraj nezruchnim vidstezhennya chasu zhittya ob yektiv u pam yati j ruchne keruvannya neyu U cih movah shiroko vikoristovuyutsya spiski i zasnovani na nih skladni strukturi danih pid chas roboti program postijno stvoryuyutsya nadbudovuyutsya rozshiryuyutsya kopiyuyutsya i pravilno viznachiti moment vidalennya togo chi inshogo ob yekta vazhko U promislovih procedurnih i ob yektnih movah pribirannya smittya dovgo ne vikoristovuvalasya Perevaga viddavalasya ruchnomu keruvannyu pam yattyu yak bilsh efektivnomu ta peredbachuvanomu Ale z drugoyi polovini 1980 h rokiv tehnologiya zbirannya smittya stala vikoristovuvatisya i v direktivnih imperativnih i v ob yektnih movah programuvannya a z drugoyi polovini 1990 h rokiv use bilshe chislo stvoryuvanih mov i seredovish oriyentovanih na prikladne programuvannya mistyat mehanizm zboru smittya abo yak yedinij abo yak odin z dostupnih mehanizmiv keruvannya dinamichnoyu pam yattyu Nini koli vona vikoristovuyetsya movami Oberon Java Python Ruby Perl C D F ta inshimi movami Osnovnij princip z yakim pracyuyut rizni algoritmi zbirannya smittya polyagaye v nastupnomu Viznachiti ob yekti sho ne potribni dlya podalshoyi roboti programi Vivilniti resursi zajnyati cimi ob yektami Chasto avtomatichne zbirannya smittya protistavlyayut ruchnomu keruvannyu pam yattyu yake na vidminu vid avtomatichnogo vimagaye vid rozrobnika samomu pisati instrukciyi vidilennya pam yati ta yiyi zvilnennya Nejtralnist ciyeyi statti pid sumnivom Bud laska oznajomtesya z vidpovidnim obgovorennyam ta za mozhlivosti vipravte nedoliki Cherven 2012 Problemi ruchnogo keruvannya pam yattyuTradicijnim dlya direktivnih mov sposobom keruvannya pam yattyu ye ruchnij Jogo sutnist u takomu Dlya stvorennya ob yekta v dinamichnoyi pam yati programist yavno viklikaye komandu vidilennya pam yati Cya komanda povertaye vkazivnik na vidilenu dilyanku pam yati yakij zberigayetsya i vikoristovuyetsya dlya dostupu do neyi Do tih pir poki stvorenij ob yekt potriben dlya roboti programi programa zvertayetsya do nogo cherez ranishe zberezhenij vkazivnik Koli potreba v ob yekti znikaye programist yavno viklikaye komandu zvilnennya pam yati peredayuchi yij vkazivnik na stvorenij ob yekt U bud yakij movi sho dopuskaye stvorennya ob yektiv u dinamichnij pam yati potencijno mozhlivi dvi problemi zavisli vkazivniki i vitoki pam yati Zavislij vkazivnik Dokladnishe Zavisli vkazivniki Zavislij vkazivnik ce vkazivnik yakij zalishayetsya u vikoristanni dlya posilannya na ob yekt yakij uzhe vidalenij Pislya vidalennya ob yekta vsi zberezheni v programi posilannya na nogo stayut zavislimi Pam yat zajmana ranishe ob yektom mozhe buti peredana operacijnij sistemi i stati nedostupnoyu abo buti vikoristana dlya rozmishennya novogo ob yekta v tij samij programi U pershomu vipadku sproba zvernutisya po povislogo vkazivnika prizvede do spracovuvannya mehanizmu zahistu pam yati j avarijnoyi zupinki programi a v drugomu do neperedbachuvanih naslidkiv Poyava zavislih posilan zazvichaj staye naslidkom nepravilnoyi ocinki chasu zhittya ob yekta programist viklikaye komandu vidalennya ob yekta do togo yak jogo vikoristannya pripinitsya Vitik pam yati Dokladnishe Vitik pam yati Stvorivshi ob yekt u dinamichnij pam yati programist mozhe ne vidaliti jogo pislya zavershennya vikoristannya Yaksho na ob yekt nemaye posilan vin staye programno nedostupnim ale prodovzhuye zajmati pam yat oskilki komanda jogo vidalennya ne viklikana Cya situaciya i nazivayetsya vitokom pam yati Yaksho ob yekti posilannya na yaki gublyatsya stvoryuyutsya v programi postijno to vitik pam yati proyavlyayetsya v postupovomu zbilshenni obsyagu vikoristovuvanoyi pam yati yaksho programa pracyuye dovgo obsyag vikoristovuvanoyi neyu pam yati postijno zrostaye i cherez yakijs chas vidchutno spovilnyuyetsya robota sistemi cherez neobhidnist pid chas bud yakogo vidilennya pam yati vikoristovuvati pidkachuvannya storinok abo programa vicherpuye dostupnij obsyag adresnogo prostoru i zavershuyetsya z pomilkoyu Vpliv avtomatichnogo zbirannya smittya na shvidkodiyuDoslidzhennya vplivu avtomatichnogo zbirannya smittya na shvidkodiyu program dlya mov programuvannya rozroblenih dlya zastosuvannya lishe razom z avtomatichnim zbirannyam smittya takih yak Java Objective Caml Python tosho uskladnyuyetsya brakom mozhlivosti vimiryuvati shvidkodiyu programi z ruchnim keruvannyam pam yattyu Odnak u doslidzhenni Metyu Gerca ta Emeri Bergera porivnyano shvidkodiyu ruchnogo keruvannya pam yattyu ta pribiralnikiv smittya yak z kopiyuvannyam tak i bez kopiyuvannya Ci vimiryuvannya doveli sho najkrashij za shvidkodiyeyu pribiralnik smittya mozhe konkuruvati za shvidkodiyeyu z ruchnim keruvannyam pam yattyu yaksho jomu nadati dosit bagato pam yati Zokrema z vikoristannyam up yatero bilshoyi pam yati jogo shvidkodiya vidpovidaye ruchnomu variantu Za nayavnosti vtrichi bilshoyi vilnoyi pam yati vin pracyuye v serednomu na 17 povilnishe za ruchne keruvannya pam yattyu A z vikoristannyam udvichi bilshoyi pam yati shvidkodiya zmenshuyetsya na 70 V umovah braku fizichnoyi pam yati vikoristannya vpovilnyuye shvidkodiyu pribiralnika smittya v razi porivnyano z ruchnim keruvannyam Vimogi do movi ta sistemiShob programa mogla vikoristovuvati zbirannya smittya neobhidno vikonannya nizki umov sho nalezhat do movi seredovisha vikonannya i samoyi rozv yazuvanoyi zadachi Neobhidnist seredovisha vikonannya zi zbiracha smittya Prirodno dlya zboru smittya neobhidne dinamichne seredovishe sho pidtrimuye vikonannya programi i nayavnist u comu seredovishi zbiracha smittya Pidtrimka z boku movi programuvannya Zbirach smittya mozhe normalno funkcionuvati tilki todi koli vin mozhe tochno vidstezhiti vsi posilannya na vsi stvoreni ob yekti Ochevidno yaksho mova dopuskaye peretvorennya posilan vkazivnikiv v inshi tipi danih cili chisla masivi bajtiv i tak dali na kshtalt S C vidstezhiti vikoristannya takih peretvorenih posilan staye nemozhlivo i zbirannya smittya staye bezgluzdim vona ne zahishaye vid zavislih vkazivnikiv i vitokiv pam yati Tomu movi oriyentovani na vikoristannya zbirannya smittya zazvichaj istotno obmezhuyut svobodu vikoristannya vkazivnikiv adresnoyi arifmetiki peretvoren tipiv vkazivnikiv do inshih tipiv danih U chastini z nih uzagali nemaye tipu danih vkazivnik u chastini vin ye ale ne dopuskaye ni peretvoren tipu ni zmini Tehnichna dopustimist korotkochasnih upovilnen u roboti program Pribirannya smittya vikonuyetsya periodichno zazvichaj u zazdalegid nevidomi momenti chasu Yaksho pripinennya roboti programi na chas porivnyannij iz chasom zbirannya smittya mozhe prizvesti do kritichnih pomilok vikoristovuvati v podibnij situaciyi zbirannya smittya ochevidno ne mozhna Nayavnist deyakogo rezervu vilnoyi pam yati Chim bilshe pam yati dostupno seredovishi vikonannya tim ridshe zapuskayetsya zbirach smittya i tim efektivnishe jogo robota Robota zbiracha smittya v sistemi de kilkist dostupnoyi zbirachevi pam yati nablizhayetsya do pikovoyi potrebi programi mozhe viyavitisya neefektivnoyu i neproduktivnoyu Chim menshe nadlishok pam yati tim chastishe vidbuvayetsya zapusk zbiracha i tim bilshe chasu vitrachayetsya na jogo vikonannya Padinnya produktivnosti programi v takomu rezhimi mozhe viyavitisya zanadto istotnim PrimitkiShehovcov V A 10 6 Pidrahunok posilan i zbirannya smittya Operacijni sistemi BHV Publishing Group s 246 ISBN 9789665521570 Recursive functions of symbolic expressions and their computation by machine Part I Matthew Hertz and Emery D Berger Quantifying the Performance of Garbage Collection vs Explicit Memory Management z dzherela 27 lyutogo 2012 Procitovano 4 chervnya 2012 Div takozhLisp persha mova programuvannya z avtomatichnim zbirannyam smittya Simula ta Smalltalk pershi ob yektno oriyentovani movi programuvannya takozh mali avtomatichne zbirannya smittya Java C suchasni populyarni movi programuvannya z avtomatichnim zbirannyam smittya