Fundamentals of garbage collection

У наступному списку перераховані важливі поняття пам'яті середовища CLR.

Віртуальна пам'ять може перебувати в трьох станах.

Вільна. Посилання на блок пам'яті відсутні, і він доступний для виділення.

Зарезервовано. Блок пам'яті доступний для використання розробником і не може використовуватися для будь-якого іншого запиту на виділення. Однак збереження даних в цей блок пам'яті неможливо, поки він не буде виділено.

Виділена. Блок пам'яті призначений фізичній сховища.

Після ініціалізації середовищем CLR збирач сміття виділяє сегмент пам'яті для зберігання об'єктів і управління ними. Ця пам'ять називається керованою купою на відміну від власної купи операційної системи.

Керована купа створюється для кожного керованого процесу. Всі потоки в процесі виділяють пам'ять для об'єктів в одній і тій же купі.

Для резервування пам'яті збирач сміття викликає функцію Win32 VirtualAlloc і резервує по одному сегменту пам'яті за раз для керованих додатків. Складальник сміття також резервує сегменти в міру необхідності і повертає звільнені сегменти операційній системі (попередньо очистивши їх від усіх об'єктів), викликаючи функцію Win32 VirtualFree.

Розмір сегментів, виділених складальником сміття, залежить від реалізації і може бути змінений в будь-який час, в тому числі при періодичних оновленнях. Додаток не повинно робити ніяких припущень щодо розміру певного сегмента, покладатися на нього або намагатися налаштувати обсяг пам'яті, доступний для виділення сегментів.

Чим менше об'єктів розподілено в купі, тим менше доведеться працювати збирачеві сміття. При розміщенні об'єктів не використовуйте заокруглені значення, що перевищують фактичні потреби, например не виділяйте 32 байта, коли необхідно лише 15 байтів.

Прибирання сміття, коли вона запущена, звільняє пам'ять, зайняту невикористовуваними об'єктами. Процес звільнення стискає використовувані об'єкти, щоб вони переміщалися разом, і видаляє простір, зайняте невикористовуваними об'єктами, зменшуючи, таким чином, купу. Це гарантує, що об'єкти, розподілені спільно, залишаться в керованій купі поруч, щоб зберегти їх локальність.

Ступінь втручання (частота і тривалість) збірок сміття залежить від числа розподілів і збереглася в керованій купі пам'яті.

Купу можна розглядати як сукупність двох куп: купа великих об'єктів і купа маленьких об'єктів.

Купа великих об'єктів містить дуже великі об'єкти розміром від 85 000 байт. Об'єкти в купі великих об'єктів зазвичай є масивами. Примірник об'єкта рідко буває дуже великим.

Купа організована у вигляді поколінь, що дозволяє їй обробляти довгоживучі і короткоживучі об'єкти. Прибирання сміття в основному зводиться до знищення короткоживучих об'єктів, які зазвичай займають тільки невелику частину купи. У купі існує три покоління об'єктів.

Покоління 0. Це наймолодше покоління містить короткоживучі об'єкти. Прикладом короткоживучого об'єкта є тимчасова змінна. Прибирання сміття найчастіше виконується в цьому поколінні.

Знову розподілені об'єкти утворюють нове покоління об'єктів і неявно є збірками покоління 0, якщо вони не є великими об'єктами, в іншому випадку вони потрапляють в купу великих об'єктів в збірці покоління 2.

Більшість об'єктів знищуються при складанні сміття для покоління 0 і не доживають до наступного покоління.

Покоління 1. Це покоління містить коротко живуть об'єкти і служить буфером між короткоживущими і довгоживучими об'єктами.

Покоління 2. Це покоління містить довгоживучі об'єкти. Прикладом довгоживучих об'єктів служить об'єкт в серверному додатку, що містить статичні дані, які існують протягом тривалості процесу.

Збірки сміття виконуються для конкретних поколінь при виконанні відповідних умов. Збірка покоління означає збір об'єктів в цьому поколінні і в усіх відповідних молодших поколіннях. Прибирання сміття покоління 2 також називається повною збіркою сміття, так як вона знищує всі об'єкти у всіх поколіннях (тобто всі об'єкти в керованій купі).

Об'єкти, які не знищуються при складанні сміття, називаються вижили об'єктами і переходять в наступне покоління. Об'єкти, які пережили збірку сміття для покоління 0, переходять в покоління 1, об'єкти, які пережили збірку сміття для покоління 1, переходять в покоління 2, а об'єкти, які пережили збірку сміття для покоління 2, залишаються в поколінні 2.

Коли збирач сміття виявляє високу частку виживання в поколінні, він підвищує поріг розподілів для цього покоління, щоб при наступній збірці сміття звільнялася помітна частина використаної пам'яті. У середовищі CLR безперервно контролюється рівновагу двох пріоритетів: не дозволити робочому набору додатки стати занадто великим і не дозволити збірці сміття займати занадто багато часу.

Так як об'єкти в поколіннях 0 і 1 є короткоживущими, ці покоління називаються ефемерними поколіннями.

Ефемерні покоління повинні розподілятися в сегменті пам'яті, який називається ефемерним сегментом. Кожен новий сегмент, отриманий складальником сміття, стає новим ефемерним сегментом і містить об'єкти, які пережили збірку сміття для покоління 0. Старий ефемерний сегмент стає новим сегментом покоління 2.

Розмір ефемерного сегмента залежить від того, чи є система 32- або 64-розрядної, і від типу збирача сміття. У таблиці нижче представлені значення за замовчуванням.

Прибирання сміття складається з наступних етапів:

Етап маркування, що виконує пошук всіх використовуваних об'єктів і становить їх перелік.

Етап переміщення, відновлювальний посилання на стискувані об'єкти.

Етап стиснення, який звільняє простір, зайняте невикористовуваними об'єктами і стискає вижили об'єкти. На етапі стиснення об'єкти, які пережили збірку сміття, переміщаються до більш старому кінця сегмента.

Так як складання покоління 2 можуть займати кілька сегментів, об'єкти, що перейшли в покоління 2, можуть бути переміщені в більш старий сегмент. Ті, що вижили об'єкти поколінь 1 і 2 можуть бути переміщені в інший сегмент, так як вони перейшли в покоління 2.

Щоб визначити, чи є об'єкти використовуються, збирач сміття задіє такі відомості.

Коріння стека. Змінні стека, надані JIT-компілятором і засобом обходу стека.

Дескриптори збірки сміття. Дескриптори, які вказують на керовані об'єкти і які можуть бути виділені для користувача кодом або середовищем CLR.

Статичні дані. Статичні об'єкти в доменах додатків, які можуть посилатися на інші об'єкти. Кожен домен додатки стежить за своїми статичними об'єктами.

Перед запуском збірки сміття все керовані потоки, крім потоку, що запустив збірку сміття, припиняються.

На наступному малюнку показаний потік, що запускає збірку сміття і викликає припинення інших потоків.

Fundamentals of garbage collection

Потік, що запускає збірку сміття

Схожі статті