Назад Зміст Вперед

Збирач сміття Garbage Сollector

Автоматичне керування пам'яттю

Java використовує автоматичний збирач сміття для керування пам'яттю під час життєвого циклу об'єкта. Програміст вирішує, коли створювати об'єкти, а віртуальна машина відповідальна за звільнення пам'яті після того, як об'єкт стає непотрібним. Коли до певного об'єкта вже не залишається посилань, збирач сміття може автоматично прибирати його із пам'яті. Проте, витік пам'яті все ж може статися, якщо код, написаний програмістом, має посилання на вже непотрібні об'єкти, наприклад на об'єкти, що зберігаються у діючих контейнерах.
Збирання сміття дозволене у будь-який час. В ідеалі воно відбувається під час бездіяльності програми. Збір сміття автоматично форсується при нестачі вільної пам'яті в купі для розміщення нового об'єкта, що може призводити до кількасекундного зависання. Тому існують реалізації віртуальної машини Java з прибиральником сміття, спеціально створеним для програмування систем реального часу.
Java не має підтримки вказівників у стилі C/C++. Це зроблено задля безпеки й надійності, аби дозволити збирачу сміття переміщувати вказівникові об'єкти.

Garbage collector 

У Java з самого початку був введений механізм автоматичного збору сміття (від англійського garbage collector). Припустимо, програма створює деякий об'єкт, працює з ним, а далі настає момент, коли він більше вже не потрібен. Необхідно звільнити займану пам'ять, щоб не заважати операційній системі нормально функціонувати. 

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

Проте, досвідчені розробники були незадоволені тим, що вони не можуть повністю контролювати все, що відбувається з їхньою системою. Немає точної інформації, коли саме буде видалений об'єкт, що став непотрібним, коли почне працювати (а значить, і займати системні ресурси) потік збирача сміття і т.д. Але при всій повазі до досвіду таких програмістів, необхідно відзначити, що переважна кількість збоїв програм, написаних на С/С++, припадає саме на некоректну роботу з пам'яттю, причому деколи це трапляється навіть з широко поширеними продуктами вельми серйозних компаній.

Крім введення garbage collector, були зроблені й інші кроки для полегшення розробки.
.