1. Робота з поколіннями об'єктів

Java-збирачі сміття реалізують деяку стратегію збирання сміття поколінь, яка вміє класифікувати об'єкти за віком.

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

Область пам'яті купи JVM розділена на три секції:

Робота з поколіннями об'єктів

2. Молоде покоління

Новостворені об'єкти починаються у молодому поколінні. Молоде покоління далі поділяється на дві категорії.

  • Простір Едему — нові об'єкти починають тут, їм виділяється початкова пам'ять.
  • Об'єкти, що вижили (FromSpace та ToSpace), переміщуються сюди з Едему після того, як пережили один цикл збирання сміття.

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

Коли простір Едему заповнено об'єктами, виконується мале збирання сміття. Всі мертві об'єкти видаляються, а всі живі — переміщаються в один із двох просторів, що залишилися. Мале GC також перевіряє об'єкти в просторі тих, хто вижив, і переміщає їх в інший (наступний) простір тих, що вижили.

Візьмемо за приклад наступну послідовність.

  1. В Едемі є об'єкти обох типів (живі та мертві).
  2. Відбувається мале GC – всі мертві об'єкти видаляються з Едему. Усі живі об'єкти переміщуються у простір-1 (FromSpace). Едем та простір-2 тепер порожні.
  3. Нові об'єкти створюються та додаються до Едему. Деякі об'єкти в Едемі та просторі-1 стають мертвими.
  4. Відбувається мале GC – всі мертві об'єкти видаляються з Едему та простору-1. Усі живі об'єкти переміщуються у простір-2 (ToSpace). Едем та простір-1 порожні.

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

Для встановлення розміру молодого покоління можна скористатися прапором -Xmn.

3. Старше покоління

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

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

Для встановлення початкового та максимального розміру пам'яті купи можна скористатися прапорами -Xms та -Xmx.

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

Щоб зрозуміти просування об'єктів між просторами та поколіннями, розглянемо наступний приклад:

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

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

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

4. Постійне покоління та мета-простір

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

Для встановлення початкового та максимального розміру постійного покоління ви можете скористатися прапорами -XX:PermGen та -XX:MaxPermGen.

Мета-простір

Починаючи з Java 8, на зміну простору постійного покоління (PermGen) приходить простір пам'яті MetaSpace. Реалізація відрізняється від PermGen – цей простір купи тепер змінюється автоматично.

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