Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ППН ТП.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
98.74 Кб
Скачать

13,4. Управління пам'яттю в купі

Управління пам'яттю відноситься до числа тих властивостей мови Java, які закладені в саме його ядро ​​і безпосередньо забезпечуються Java VM. Особливістю управління пам'яттю в Java є те, що з точки зору прикладного програміста його практично немає. Пам'ять для даних примітивних типів виділяється в області локальних змінних кадру. Кадр для методу виділяється тільки на час виконання методу, при завершенні виконання пам'ять кадру звільняється, а отже, і звільняються і всі локальні змінні. Цей механізм подібний розміщенню локальних змінних в стеці в традиційних блокових мовах програмування (C / C + +, PL / 1 і т.д.). Посилальні типи складаються з двох частин: посилання на об'єкт і власне тіла об'єкта. Масиви в Java також є посилальним типом, і все, що далі говориться про об'єкти, справедливо і для масивів. Посилання являє собою адресу пам'яті, покажчик на об'єкт в термінах мови C / C + +, але на відміну від C / C + +, адресна арифметика в Java не дозволена. Об'єкт в програмі доступний тільки через змінну, яка є посиланням на нього.

Отже, пам'ять, яка виділяється для посилань, управляється автоматично, як і пам'ять для примітивних типів. Інакше йде справа з пам'яттю, що виділяється для тіла об'єкта. У мові Java є нова операція, яка явно виділяє пам'ять для тіла об'єкта і повертає посилання на створений об'єкт. Пам'ять для кожного об'єкта виділяється явним чином, за допомогою цієї операції. Створення нових об'єктів можливе також неявним чином - деякі бібліотечні методи створюють (за допомогою тієї ж операції нова) новий об'єкт і повертають посилання на створений об'єкт. На цьому "турботи" прикладної Java-програми про управління пам'яттю закінчуються. Програма не звільняє виділену пам'ять, це робить за неї Java VM. Автоматичне звільнення пам'яті, займаної вже непотрібними (невикористовуваними) об'єктами, - одна з найбільш цікавих особливостей платформи Java. Це звільнення виконується в Java VM програмним механізмом, який називається складальником сміття (збирач сміття). Але що таке невживаний об'єкт? Програма може "залишити об'єкт у спокої" на довгий час, а потім раптом знову повернутися до нього. Час звернення до об'єкту (як це робиться в дисципліні управління пам'яттю LRU) не може служити показником непотрібності об'єкта. Збирач сміття вважає невикористовуваними ті об'єкти, на які немає посилань. Якщо в програмі немає посилання на об'єкт, то програма принципово не може звернутися до об'єкта, отже, об'єкт являє собою сміття. Зверніть увагу на ту обставину, що при виході з блоку, в якому був створений об'єкт, звільняється пам'ять, яка була зайнята посиланням на об'єкт, але це ще не означає, що об'єкт відразу ж ставати сміттям. Посилання на створений об'єкт може бути присвоєний зовнішньо по відношенню до даного блоку змінної або бути поверненим значенням методу. Якщо ж цього не відбувається, то об'єкт дійсно стає сміттям. При виконанні Java-програми таке сміття в пам'яті накопичується. Багато методів бібліотечних класів Java (наприклад, класу String) побудовані таким чином, що їх використання сприяє інтенсивному накопиченню сміття в пам'яті.

Коли накопичення сміття призводить до браку пам'яті, вступає в дію збирач сміття. Для забезпечення роботи збирача сміття в дескрипторі кожного об'єкта є "ознака сміття". При створенні об'єкта "ознака сміття" встановлюється в зведеному стані. Алгоритм роботи збирача сміття (один з його варіантів) складається з двох фаз:

Фаза маркування. Збирач сміття переглядає області локальних змінних всіх активних в даний момент методів, а також поля всіх доступних об'єктів. У дескрипторах тих об'єктів, на які є посилання в проглянутих областях "ознака сміття" скидається

Фаза очищення. Проглядається область купи, дескриптори всіх об'єктів. Ті об'єкти, "ознака сміття" яких виявляється зведеним (не був скинутий в фазі маркування), є сміттям, займана ними пам'ять звільняється. У тих же об'єктів, "ознака сміття" яких скинутий, ця ознака зводиться - для підготовки до наступної збірці сміття.

Витрати на виконання збірки сміття практично не залежать від кількості сміття - в будь-якому випадку потрібен повний перегляд і областей локальних змінних, і купи. Отже, збірку сміття вигідніше виробляти тільки в ті моменти, коли сміття накопичиться багато: в цьому випадку при тих же витратах буде отриманий більший результат. Тому операція збірки сміття може створювати деяку проблему при виконанні Java-програм. Проблема полягає в тому, що момент активізації збирача сміття непередбачуваний, а коли така активізація відбудеться, вона викличе затримку в обчисленнях. У нових реалізаціях Java VM цю проблему намагаються якщо не вирішити кардинально, то дещо згладити, запускаючи збирач сміття в окремій низькопріоритетній ниткі.

Хоча область методів теж формально належить купі, в більшості сучасних Java VM збирач сміття в цій області не працює.