Основи управління пам'яттю в java

Загальні відомості про управління пам'яттю

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

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

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

Всі проблеми ручного способу управління пам'яті в Java вирішує автоматичний збирач сміття. Але перед ознайомленням зі складальником сміття, потрібно роз'яснити поняття купи (heap).

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

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

Розмір купи залежить від використовуваної платформи, але, як правило, це десь між 2 і 128 Кб.

Garbage Collection

Механізм складання сміття - це процес звільнення місця в купі, для можливості додавання нових об'єктів.

Об'єкти створюються за допомогою оператора new, тим самим привласнюючи об'єкту посилання. Закінчивши роботу з об'єктом, ви просто перестаєте на нього посилатися - досить привласнити змінної посилання на інший об'єкт або значення null або припинити виконання методу, щоб його локальні змінні завершили своє існування природним чином. Об'єкти, посилання на які відсутні, прийнято називати сміттям (garbage), який буде видалений.

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

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

Схожі статті