Термінологія Java heap: молоді, старі та постійні покоління?


318

Я намагаюся зрозуміти, які поняття молодих , старих і постійних поколінь містяться в термінології Java купи, а точніше взаємодії трьох поколінь.

Мої запитання:

  • Що таке молоде покоління?
  • Що таке старе покоління?
  • Що таке постійне покоління?
  • Як три покоління взаємодіють / співвідносяться між собою?

Якщо припустити, що ви говорите про Sun JDK / OpenJDK, перегляньте сторінку на веб-сайті OpenJDK про Управління зберіганням . Внизу є кілька посилань на ще більше інформації.
Ніколас Райлі

1
також пов'язане з цим питанням "
затримане

Відповіді:


304

Це здається звичайним непорозумінням. У JVM Oracle постійне покоління не є частиною купи. Це окремий простір для визначень класів та супутніх даних. У Java 6 та новіших версіях інтерновані рядки також зберігалися у постійному поколінні. У Java 7 інтерновані рядки зберігаються в основній купі об’єктів.

Ось хороший пост про постійне покоління .

Мені подобаються описи, наведені для кожного простору в посібнику Oracle на JConsole :

Для HotSpot Java VM пули пам’яті для послідовного збору сміття є наступними.

  • Eden Space (купа): пул, з якого спочатку виділяється пам'ять для більшості об'єктів.
  • Космос для виживання (купа): басейн, що містить предмети, що пережили збирання сміття з простору Едему.
  • Загальне покоління (купа): Пул, що містить об'єкти, які існували певний час у просторі вцілілих.
  • Постійне покоління (non-heap): Пул, що містить усі відображаючі дані самої віртуальної машини, такі як об'єкти класів та методів. Що стосується Java VM, які використовують обмін даними класу, це покоління поділяється на області лише для читання та для читання та запису.
  • Кеш-код (негромадний): HotSpot Java VM також включає кеш-код коду, що містить пам'ять, яка використовується для компіляції та зберігання нативного коду.

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


2
Я вважаю, що, як і в Java 7, рядки вже не інтернуються в постійне покоління.
Тім Гудман

Ви маєте рацію, я здивований, що це збереглося так довго до згадки. Тоді в Java 8 постійне покоління буде замінено на метапростір (хоча я не впевнений, наскільки це буде насправді, окрім того, що це не обмежене за замовчуванням)
Джошуа Маккіннон,

9
Джошуа - це "старий" синонім "затриманий", а "новий" синонім "виживший"?
Джоадха

1
рід пермі застосовується лише до Java 8.
lwpro2,

2
Якщо ви все ще чекаєте відповіді, так, ви праві @joadha. Перевірте це посилання: codeahoy.com/2017/08/06/basics-of-java-garbage-collection
recepinanc

197

Купа поділяється на молоде та старе покоління так:

Молоде покоління : це місце, де прожили короткий період і розділилися на два простори:

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

Old Generation : Цей басейн, в основному, містить затятий і віртуальний (зарезервований) простір, і він буде містити ті об'єкти, які збереглися після збору сміття від Young Generation.

  • Титульований простір: Цей пул пам’яті містить об’єкти, що вижили після багаторазового вивезення сміття, означає об’єкт, який вижив після збору сміття з простору Survivor.

Постійне покоління: Цей пул пам'яті, як називається, також містить інформацію про метадані постійного класу та дескриптори, тому простір PermGen завжди зарезервований для класів і тих, які прив'язані до класів, наприклад, статичних членів.

Оновлення Java8: PermGen замінено на Metaspace, який дуже схожий.
Основна відмінність полягає в тому, що метапростір динамічно змінюється, тобто він може розширюватися під час виконання.
Простір метапространства Java: без обмежень (за замовчуванням)

Кеш-код коду (віртуальний або зарезервований): Якщо ви використовуєте HotSpot Java VM, це включає область кешу коду, яка містить пам'ять, яка буде використана для компіляції та зберігання нативного коду.

введіть тут опис зображення

Люб'язно


@Premraj, що це означає, що метапростір динамічно змінюється, тобто він може розширюватися під час виконання. ? Єдина відмінність, що за замовчуванням він не має межі?
gstackoverflow

1
чудово ... я можу знати, де на цій фотографії розміщена область методу, стаціонарний стек та постійний пул виконання? і що вони відповідно дотримуються?

якщо кеш коду використовується для коду власного методу, що матиме стек методів (у кожного потоку буде такий)?

49

Що таке молоде покоління?

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

Що таке старе покоління?

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

Що таке постійне покоління?

Постійне покоління містить метадані , необхідні JVM для опису класів і методів , використовуваних в додатку. Постійне покоління заселяється JVM під час виконання на основі класів, які використовує додаток.

PermGen був замінений на Metaspace з моменту випуску Java 8.

Параметри PermSize & MaxPermSize зараз будуть ігноровані

Як три покоління взаємодіють / співвідносяться між собою?

введіть тут опис зображення

Стаття про підручник із джерела зображень та oracle technetwork: http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

" Загальний процес вивезення сміття " у цій статті пояснює взаємодію між ними з багатьма діаграмами.

Подивіться підсумкову діаграму:

введіть тут опис зображення


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

докладнішу інформацію див. у docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html . Область методу створюється при запуску віртуальної машини. Хоча область методу логічно є частиною купи, прості реалізації можуть вирішити не збирати сміття чи ущільнювати його. Кожен постійний пул часу роботи виділяється з області методу Java Virtual Machine
Равіндра бабу

Ви впевнені ... я читав, що її частина простору Пермген (яка не купа)? journaldev.com/2856/…

Документація Oracle є більш автентичною
Равіндра бабу

Чи встановлений поріг для об'єкта молодого покоління в одиницях часу (наприклад, мс)? або GC тури?
Дуже об’єктивно

16

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


1

Пам'ять у SunHotSpot JVM організована у три покоління: молоде покоління, старе покоління та постійне покоління.

  • Молоде покоління: новостворені об’єкти виділяються молодому роду.
  • Old Generation: Якщо новий об'єкт вимагає більшого простору купи, він виділяється безпосередньо в старий ген. Також об'єкти, які пережили кілька циклів GC, переходять до старого роду, тобто довгоживучих об'єктів будинку в старому ген.
  • Постійне покоління: Постійне покоління містить об'єкти, які JVM вважає зручними для управління збирачем сміття, наприклад об'єкти, що описують класи та методи, а також самі класи та методи.

FYI: Постійний рід не вважається частиною купи Java.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.