2013-05-14 3 views
19

Я читал о сборке мусора в Java и SO Q & А, но я смущен о типах Мусорной коллекции.Java Major and Minor Garbage Collections

В качестве примера возьмем коллектор пропускной способности. (он же параллельный коллектор). Документы говорят, что он использует несколько потоков для создания Незначительных коллекций и одной нити для Основные коллекции (такие же, как серийный коллектор).

Теперь мои вопросы:

  1. Что значит Полный GC: а) Означает ли это, как мелкие и крупные коллекции сделаны? Или b) Полный GC == Основные коллекции? Который из них?
  2. Если a), означает ли это, что Малая коллекция все еще выполняется с использованием нескольких потоков, тогда как майор был сделан с использованием Single?
  3. Если b), означает ли это, что и молодые & Старые поколения были очищены с помощью Single Thread?

Также, 4. Полностью ли GC влияет только на OldGeneration или YoungGeneration?

Заранее спасибо.

+1

+1. Спасибо, что задали мой вопрос – Imposter

ответ

27

Позвольте мне объяснить.

В качестве примера возьмем коллектор пропускной способности. (он же параллельный коллектор). Документы говорят, что он использует несколько потоков для создания небольших коллекций и одного потока для основных коллекций (то же, что и для последовательного коллектора).

Вот что нужно понимать. По умолчанию в большинстве новых систем JVM использует два разных сборщика мусора для молодых и старых поколений. На моей моей машине: у меня есть Параллельный новый коллектор для молодого поколения и Параллельный Марк и Sweep Collector для старшего поколения.

Незначительная коллекция запускается, когда тогда JVM не может выделить место для нового объекта (помните: новые объекты всегда выделяются в Eden Area Young Generation).

Следующий вопрос:

Что означает Полным GC: а) Означает ли это, как мелкие и крупные коллекции сделаны? Или b) Полный GC == Основные коллекции? Который из них?

и

Кроме того, 4. Имеет ли Full GC влияет только на OldGeneration или YoungGeneration, а?

Это зависит. JVM сообщает каждую основную коллекцию как полную GC. [Попробуйте с этими флагами java -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamp].Педантичное определение состоит в том, что Full GC запускает Minor сначала, а затем Major (хотя порядок можно переключить, если «Пожилое поколение» заполнено, и в этом случае он сначала освобождается, чтобы позволить ему получать объекты из Young Generation).

ОК, обратно в пункт. JVM рассматривает Major Collection [в Старом (или Пермском) поколении] как Full GC. Ниже приведены результаты из программы, которую я смог быстро написать, чтобы проиллюстрировать эту точку. Первая строка - Minor GC, вторая - Major (Full) GC. Вы можете видеть, что это произошло только в «Старом поколении» (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]

Следующий вопрос:

Если), это означает, что Minor коллекция до сих пор осуществляется с использованием нескольких потоков, тогда как Major было сделано, используя Single?

Да. См. Начало моего ответа. Молодые и пожилые поколения обслуживаются разными Коллекционерами. Для молодого поколения, вы можете использовать один из следующих вариантов:

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

Для старого поколения, доступные варианты:

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

Убрать вопрос и ответить на кристалл – Imposter

+2

В HotSpot 6 есть также -XX: + UseG1GC' (но не первые релизы) и 7, которые управляют как молодыми, так и старыми поколениями. –

0

Хотя ответ гоблина все еще правильна в общих чертах, по крайней мере эта часть сейчас устарела:

Это зависит от многого. JVM сообщает каждую основную коллекцию как полную GC.

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

Смежные вопросы