/ / Основні та мінорні зібрання сміття Java - java, garbage-collection

Колекції Java і малих сміттєвих колекцій - java, збирання сміття

Я читав про збирання сміття на Java та SO Q&A, але я заплутаний у відношенні видів збору сміття.

Візьмемо "Приклад колектор пропускної здатності" (наприклад, паралельний колектор). Документи кажуть, що він використовує кілька потоків для виконання Незначні колекції та одна нитка для Майор колекції (те саме, що і серійний колектор).

Тепер мої запитання:

  1. Що це означає під повним ГК: а) Чи означає це, що збираються як малі, так і основні колекції? Або б) Повний GC == Основні колекції? Який це?
  2. Якщо а) чи означає це, що Збірка неповнолітніх все ще виконується за допомогою декількох потоків, тоді як майор був зроблений за допомогою одиночного?
  3. Якщо б), чи означає це, що і молоді, і старі покоління були очищені за допомогою єдиної нитки?

Також, 4. Чи впливає також повний GC лише на OldGeneration або YoungGeneration?

Заздалегідь спасибі.

Відповіді:

31 для відповіді № 1

Дозволь пояснити.

Візьмемо як приклад колектор пропускної здатності. (він же паралельний колектор). Документи кажуть, що він використовує декілька потоків для створення колекцій "Малих" і один потік для основних колекцій (такий же, як і послідовний колектор).

Тут є щось для розуміння. За замовчуванням у більшості нових систем JVM використовує ДВІ різні збирачі сміття для молодих та старих поколінь. На моїй машині: Паралельний новий колекціонер для молодого покоління та Одночасний колектор знаків і зачисток для старшого покоління.

Незначна колекція спрацьовує, коли тоді JVM не в змозі виділити простір для нового Об'єкта (Пам'ятайте: нові нові об'єкти завжди виділяються в зоні Едену молодого покоління).

Наступне питання:

Що це означає під повним ГК: а) Чи означає це, що збираються як малі, так і основні колекції? Або б) Повний GC == Основні колекції? Який це?

і,

Також 4. Чи впливає лише повний GC лише на OldGeneration або YoungGeneration?

Це залежить. JVM звітує про кожну велику колекцію як повний GC. [Спробуйте з цими прапорами java -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamp]. Педантичне визначення полягає в тому, що Full GC виконує неповнолітніх, а за ними головний (Хоча наказ може бути змінений, якщо старе покоління заповнене; в цьому випадку його звільняють спочатку, щоб він міг отримувати предмети з молодого покоління).

Добре, повернемось до суті. JVM розглядає основну колекцію [в старій (або пермській) генерації] як повну ГК. Нижче наведені результати програми, яку я зміг швидко написати, щоб проілюструвати суть. Перший рядок - Малий ГХ, а другий - Основний (Повний) ГК. Ви можете бачити, що це сталося лише в старшому поколінні (CMS) і вдалося скоротити старе покоління з 1082K до 1034K.

  • 11.431: [GC 11.431: [ParNew: 1152K->128K(1152K), 0.0009893 secs] 2111K->1210K(6464K), 0.0010182 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
  • 17.882: [Full GC (System) 17.882: [CMS: 1082K->1034K(5312K), 0.0212614 secs] 2034K->1034K(6464K), [CMS Perm : 9426K->9410K(21248K)], 0.0213200 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]

Наступне питання:

Якщо а) чи означає це, що Збірка неповнолітніх все ще виконується за допомогою декількох потоків, тоді як майор був зроблений за допомогою одиночного?

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

  • -XX:+UseSerialGC
  • -XX:+UseParallelGC
  • -XX:+UseParNewGC

Для Old Generation доступними варіантами є:

  • -XX:+UseParallelOldGC
  • -XX:+UseConcMarkSweepGC

0 для відповіді № 2

Хоча відповідь гобліна все ще правильна при широких штрихах, принаймні ця частина застаріла:

Це залежить. JVM звітує про кожну велику колекцію як повний GC.

І CMS, і G1 розрізняють новепокоління (другорядних) колекцій, одночасних колекцій старого покоління та повних gcs. Останні - це щось вкрай важливе, і більшість GCing повинні оброблятися новими генними та одночасними колекціями.